Codeforces Round #744 (Div. 3)ABCDE1E2FG题解

Posted quinn18

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #744 (Div. 3)ABCDE1E2FG题解相关的知识,希望对你有一定的参考价值。


A - Casimir’s String Solitaire

题目链接
题意:给你一个串,每次可以删一个 A A A 和一个 B B B 或者删一个 B B B C C C 问你最后能不能删光所有的字符

所以一个 A A A对应一个 B B B,一个 C C C对应一个 B B B,所以 a + c = = b a+c==b a+c==b

#include <iostream>
#include<string>
using namespace std;
signed main() {
    int t;
    cin>>t;
    while(t--) {
        string s;
        cin>>s;
        int a=0, b=0,c=0;
	    for(int i=0; i<s.size(); i++){
	        if(s[i]=='A') a++;
	        if(s[i]=='B') b++;
	        if(s[i]=='C') c++;
	    }
    	if(b==a+c) cout<<"YES"<<endl;
    	else cout<<"NO"<<endl;
    }
    return 0;
}

B - Shifting Sort

题目链接
题意:你每次能选择一个区间把里边的数字整体向左边转 k k k 个,最终要使数列有序。操作次数不能超过 n n n

这个不能超过 n n n
就能想到每次把这个位置应该在的数字给转到这一位
摸你一下就好了

#include<bits/stdc++.h>
using namespace std;
int a[1005];
int b[1005];
int c[1005];
struct node {
    int l, r;
    int d;
}ans[55];
signed main() {
    int t; cin>>t;
    while(t--) {
        int n;cin>>n;
        for(int i=1; i<=n; i++) {
            cin>>a[i];
            b[i]=a[i];
        }
        sort(b+1, b+1+n);
        int cnt=1; int q=0; int ks=1;
        while(1) {
            for(int i=ks; i<=n; i++) {
                if(a[i]==b[cnt]) {
                    if(i==ks) {//假如本来就在这位就直接找下一个位置了因为不能l!=r
                        cnt++;
                        ks++;
                        break;
                    }
                    cnt++;
                    ans[++q].l=ks;//存答案
                    ans[q].r=i;
                    ans[q].d=i-ks;
                    int w=a[i];
                    for(int k=i; k>=ks+1; k--) a[k]=a[k-1];//把区间转过来
                    a[ks]=w;
                    ks++;
                }
            }
            bool f=1;
            for(int j=2; j<=n; j++) if(a[j]<a[j-1]) {f=0;break;}
            if(f||ks==n) break;
        }
        cout<<q<<endl;
        for(int i=1; i<=q; i++) {
            cout<<ans[i].l<<" "<<ans[i].r<<" "<<ans[i].d<<endl;
        }
    }
    return 0;
}

C - Ticks

题目链接

题意:给你一张画好的长方形纸,有长成 V V V 的样子的虫子在上面,可以重叠,问你是不是所有的虫子长度都大于等于 k k k

那我们就去找 V V V 最下面的那个点,然后把合法的虫子位置标记一下,最后看看有没有多的虫子

#include<bits/stdc++.h>
#define pii pair<int, int>
#define int long long
using namespace std;
char a[20][20];
bool vis[25][25];
int n, m, k;
bool in (int x, int y) {//判断在不在图内
    return x>=1&&x<=n&&y<=m&&y>=1;
}
signed main() {
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t; cin>>t;
	while(t--) {
        memset(vis, 0, sizeof vis);//清空
        cin>>n>>m>>k;
        for(int i=1; i<=n; i++) {
            cin>>a[i]+1;
        }
        for(int i=n; i>=1; i--) {
            for(int j=m; j>=1; j--) {
                if(a[i][j]=='*') {
                    int o=0;
                    int x=i;
                    int y=j;
                    int xx=i;
                    int yy=j;
                    //cout<<endl;
                    while(in(x, y)&&in(xx, yy)&&a[x][y]=='*'&&a[xx][yy]=='*') {
                        x--;xx--;
                        y--;
                        yy++;
                        o++;
                    }
                    o--;
                    if(o>=k) {
                        x=i, y=j, xx=i, yy=j;
                       // cout<<i<<" "<<j<<endl;
                        while(in(x, y)&&in(xx, yy)&&a[x][y]=='*'&&a[xx][yy]=='*') {
                            vis[x][y]=vis[xx][yy]=1;
                            x--;xx--;
                            y--;
                            yy++;
                        }
                    }
                }
            }
        }
        bool q=1;
        for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(!vis[i][j]&&a[i][j]=='*') q=0;
        if(q) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
	}
	return 0;
}

D - Productive Meeting

题目链接
题意:一堆人交流,两个人每交流一次他们交流的次数就会少一次(狗头,问最多的交流次数

贪心
让交流次数多的人先交流,直到只剩一个人或者都不能交流了
优先队列里直接排序了

#include<bits/stdc++.h>
#define pii pair<int, int>
#define int long long
using namespace std;
struct node {
	int a, b;
}b[200005];
signed main() {
	int t;
	cin>>t;
	while (t--) {
		int n;
		cin >> n;
		priority_queue<pii> q;
		for(int i=1; i<=n; i++) {
            int x;
            cin>>x;
            if(x) q.push({x, i});
		}
		int cnt=0;
		while (!q.empty()) {
			if (q.size() == 1) break;
			pii x=q.top();
			q.pop();
			pii y=q.top();
			q.pop();
			++cnt;
			b[cnt].a=x.second;
			b[cnt].b = y.second;
			x.first--;
			y.first--;
			if (x.first!=0) q.push(x);
			if (y.first!=0) q.push(y);
		}
		cout<<cnt<<endl;
		for(int i=1; i<=cnt; i++) cout<<b[i].a<<" "<<b[i].b<<endl;
	}
	return 0;
}

E1 - Permutation Minimization by Deque

题目链接
题意:你有一个双端队列,你可以把当前的数字放在队首也可以放在队尾,最后使队列里的序列字典序最小

所以遇到比头小的就放在头,不然就放在尾
用数组摸你队列

#include<bits/stdc++.h>
using namespace std;
int a[200005];
int b[1000005];
signed main() {
    int t;  cin>>t;
    while(t--) {
        int n;
        cin>>n;
        for(int i=1; i<=n; i++) {
            cin>>a[i];
        }
        int ks=200005;
        int js=200005;
        b[ks]=a[1];
        for(int i=2; i<=n; i++) {
            if(a[i]<b[ks]) b[--ks]=a[i];
            else b[++js]=a[i];
        }
        for(int i=ks; i<=js; i++) {
            cout<<b[i]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

E2. Array Optimization by Deque

题目链接
题意: 有个双端队列,你要通过翻转相邻的数字使放入以后的序列变得有序,问最小翻转次数的序列
贪心+树状数组


总结

呜呜呜呜呜呜

以上是关于Codeforces Round #744 (Div. 3)ABCDE1E2FG题解的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #744 (Div. 3) A-F 题解

Codeforces Round #744 (Div. 3) A-F 题解

Codeforces Round #744 (Div. 3)ABCDE1E2FG题解

Codeforces Round #744 (Div. 3)ABCDE1E2FG题解

Codeforces Round #744 (Div. 3)ABCDE1E2FG题解

Codeforces Round #436 E. Fire(背包dp+输出路径)