Codeforces Round #534 (Div. 2)
阿新 • • 發佈:2019-01-23
括號 構造 一個數 mes test 字符 ace b- 兩個
A. Splitting into digits
題意:把一個數分成若幹[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",n); for(int i=1;i<=n;i++) { printf(View Code"%d",1); if(i==n)puts(""); else printf(" "); } }
B. Game with string
題意,給出一個字符串,兩個人輪流玩遊戲,每次可以把相鄰且相同的兩個字母刪除,然後把剩下的字符串拼起來,兩個人輪流操作,不能操作就輸了,問第一個人能不能贏。
思路:和括號序列很像,用一個棧來維護字符串,每次都和棧頂元素比較一下,相同就刪去,不同就入棧。
#include<bits/stdc++.h> #define CLR(a,b) memset(a,,sizeof(a)) usingView Codenamespace 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\n"); } else puts("No"); } }
C. Grid game
題意,在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\n"); a++; }else{ printf("3 1\n"); a=0; } }else{ b=b%4+1; printf("%d 3\n",b); } } } }View Code
D. Game with modulo
題意:交互題,系統會生成一個數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\n",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\n",x,mid); cin>>replay; if(replay=="y"){ l=mid; }else{ r=mid; } // printf("l:%lld r:%lld\n",l,r); } printf("! %lld\n",l+1); cin>>opers; } if(opers=="mistake")return 0; }View Code
E. Johnny Solving
待補。
Codeforces Round #534 (Div. 2)