Educational Codeforces Round 68 (Rated for Div. 2)(A,B,C,D)

比赛链接

A. Remove a Progression

题意:有一个1~n的序列,每次从头开始删掉第i个数,问到不能删除的时候第x的位置上的数是多少。

题意:简单推一下,发现每次删掉的数都是奇数。那么能保留的x位置上的数就是x*2。

#include
using namespace std;
int main()
{
	int T;
	cin>>T;
	while(T--){
		int n,t;
		cin>>n>>t;
		cout<

 

 

B. Yet Another Crosses Problem

题意:有一张只含有黑色和白色方块的棋盘。问最少要涂多少个黑色方块,使棋盘上存在,一行,一列都是黑色方块的情况。

题解:这题的卡点就是Educational Codeforces Round 68 (Rated for Div. 2)(A,B,C,D)_第1张图片

这种情况。最优解应该是将方块画在右边的十字上。数据范围不大,直接暴力即可。

#include
using namespace std;
int main()
{
	int T;
	scanf("%d",&T);
	while(T--){
		int n,m;
		scanf("%d%d",&n,&m);
		char s[n+2][m+2];
		int a[n+2]={0},b[m+2]={0};
		for(int i=1;i<=n;++i){
			scanf("%s",s[i]+1);
			for(int j=1;j<=m;++j){
				if(s[i][j]=='*') a[i]++,b[j]++;
			}
		}
		int ans = 1e9;
		for(int i=1;i<=n;++i){
			for(int j=1;j<=m;++j){
				int t = (m-a[i])+(n-b[j]);
				if(s[i][j]=='.') t--;
				ans=min(ans,t);
			}
		}
		printf("%d\n",ans);
	}
}

C. From S To T

题意:给你三个串,S,T,P。你可以将P串的元素添加到S串中,问能否使S串和T串相等。

题解:直接模拟即可。让S串和T串匹配,相同就继续,不相同就去P中找字母填上。

 

#include
using namespace std;
int main()
{
	int T;
	scanf("%d",&T);
	while(T--){
		char s[110],t[110],p[110];
		int sum[30]={0};
		scanf("%s%s%s",s+1,t+1,p+1);
		int ls=strlen(s+1);
		int lt=strlen(t+1);
		int lp=strlen(p+1);
		for(int i=1;i<=lp;++i) sum[p[i]-'a'+1]++;
	    int i=1,j=1;
	    int flag=1;
	    if(ls>lt) {
	    	puts("NO");
	    	continue;
		}
	    while(flag){
	    	if(j==lt+1&&i==ls+1) break;
	    	if(s[i]==t[j]){
	    		i++;j++;continue;
			}else{
				if(sum[t[j]-'a'+1]){
					sum[t[j]-'a'+1]--;
					j++;
				}
				else flag=0;
			}
		}
		puts(flag?"YES":"NO");
	}
}

 

D. 1-2-K Game

题意:两个人玩游戏。有一个n,每个人每一轮可以走一步,走两步,或者走k步。如果哪个人遇到不能走的局面,则这个人输。

题解:用SG函数打表。附上打表程序。

#include 
using namespace std;
int main() {
    int T;
    scanf("%d", &T);
    for(int j = 1; j <= T; j++) {
        int k = j;
        string s;
        for(int jj = 0; jj <= 110; jj++)
            s.push_back('.') ;
        vector v;
        v.push_back(1);
        v.push_back(2);
        v.push_back(k);
        for(int i = 1; i < 100; i++) {
            for(auto d : v) {  
                if(i - d >= 0 && s[i - d] == '.')
                    s[i] = '1';
            }
        }
        cout <

Educational Codeforces Round 68 (Rated for Div. 2)(A,B,C,D)_第2张图片

1是先手必胜,' . '是先手必败。

最后得到规律,就不写了,直接看代码把。

#include
using namespace std;
int main()
{
	int T;
	scanf("%d",&T);
	while(T--){
		int n,k;
		scanf("%d%d",&n,&k);
		if(k%3!=0){
			n%=3;
			if(n) puts("Alice");
			else puts("Bob");
		}
		else {
			n%=(k+1);
			if(n==k) puts("Alice");
			else{
				n%=3;
				if(n) puts("Alice");
		    	else puts("Bob"); 
			}
		}
	}
}

 

你可能感兴趣的:(CF)