Codeforces Round #534 (Div. 2)
Posted mountaink
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #534 (Div. 2)相关的知识,希望对你有一定的参考价值。
题意:把一个数分成若干[1,9]之间的数字,使得这些数尽量相同。
思路:输出n个1。
#include<bits/stdc++.h> #define CLR(a,b) memset(a,,sizeof(a)) using namespace std; typedef long long ll; const int maxn=100010; int main(){ int n; cin>>n; int flag=0,j=2; printf("%d ",n); for(int i=1;i<=n;i++) { printf("%d",1); if(i==n)puts(""); else printf(" "); } }
题意,给出一个字符串,两个人轮流玩游戏,每次可以把相邻且相同的两个字母删除,然后把剩下的字符串拼起来,两个人轮流操作,不能操作就输了,问第一个人能不能赢。
思路:和括号序列很像,用一个栈来维护字符串,每次都和栈顶元素比较一下,相同就删去,不同就入栈。
#include<bits/stdc++.h> #define CLR(a,b) memset(a,,sizeof(a)) using namespace std; typedef long long ll; const int maxn=100010; char s[maxn]; stack<char>ss; int main() { int n; while(cin>>s) { while(!ss.empty())ss.pop(); n=strlen(s); int ans=0; int pos=0; for(int i=0; i<=n-1; i++) { if(ss.empty()) { ss.push(s[i]); continue; } char c=ss.top(); if(c==s[i]) { ans++; ss.pop(); } else { ss.push(s[i]); } } if(ans%2==1) { printf("Yes "); } else puts("No"); } }
题意,在4*4的网格中放1*2 和2*1的小矩形,同一行或者同一列被占满则被消除,要你构造一个方案,使网格不会被占满(溢出)。
思路:抛开下面的样例描述就很简单了,2*1的每次都放在一列,两个就能消除,就不会占满,2*1的每四个都摞起来,这样也不会占满。
#include<bits/stdc++.h> #define CLR(a,b) memset(a,,sizeof(a)) using namespace std; typedef long long ll; const int maxn=100010; char s[maxn]; stack<char>ss; int main() { int n; while(scanf("%s",s)!=EOF) { int a=0,b=0; for(int i=0;i<strlen(s);i++) { if(s[i]==‘0‘){ if(a==0){ printf("1 1 "); a++; }else{ printf("3 1 "); a=0; } }else{ b=b%4+1; printf("%d 3 ",b); } } } }
题意:交互题,系统会生成一个数a,然后你需要给出(x,y)这样的一个二元组,当x%a >= y %a 时,系统返回“x”,否则返回“y”,你需要在60次询问内,判断a这个数字并且输出。
倍增加二分,第一次做交互题。
如果你给出数是x<y的,当a大于x和y时,系统返回的必定是y,只有当x<a<y时,系统才会返回x。
所以一开始x从0开始,y从1开始,每次以2的幂次递增,然后就可以得到一个大的区间范围,然后用同样的方法进行二分。
#include<bits/stdc++.h> #define CLR(a,b) memset(a,,sizeof(a)) using namespace std; typedef long long ll; const int maxn=100010; string opers,replay; ll x,y; int main(){ cin>>opers; while(opers!="end"&&opers!="mistake") { x=0,y=1; replay="y"; while(replay=="y") { printf("? %lld %lld ",x,y); cin>>replay; if(replay=="y"){ x=y; y=y*2; } } ll l=x,r=y,mid; while(l<r-1) { mid=(l+r)>>1; printf("? %lld %lld ",x,mid); cin>>replay; if(replay=="y"){ l=mid; }else{ r=mid; } // printf("l:%lld r:%lld ",l,r); } printf("! %lld ",l+1); cin>>opers; } if(opers=="mistake")return 0; }
待补。
以上是关于Codeforces Round #534 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #534 (Div. 2)题解
Codeforces Round #534 (Div. 2) Solution
Codeforces Round #534 (Div. 1)
CF1103C Johnny Solving (Codeforces Round #534 (Div. 1)) 思维+构造