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

比赛链接

A. Remove a Progression

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

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

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int T;
	cin>>T;
	while(T--){
		int n,t;
		cin>>n>>t;
		cout<<t*2<<endl;
	}
 } 

 

 

B. Yet Another Crosses Problem

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

题解:这题的卡点就是

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

#include<bits/stdc++.h>
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<bits/stdc++.h>
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 <bits/stdc++.h>
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<int> 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 <<k << endl;
        cout<<s<<endl;
    }
}

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

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

#include<bits/stdc++.h>
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"); 
			}
		}
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值