1. 程式人生 > >Codeforces Round #534 (Div. 2)

Codeforces Round #534 (Div. 2)

括號 構造 一個數 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(
"%d",1); if(i==n)puts(""); else printf(" "); } }
View Code

B. Game with string

題意,給出一個字符串,兩個人輪流玩遊戲,每次可以把相鄰且相同的兩個字母刪除,然後把剩下的字符串拼起來,兩個人輪流操作,不能操作就輸了,問第一個人能不能贏。

思路:和括號序列很像,用一個棧來維護字符串,每次都和棧頂元素比較一下,相同就刪去,不同就入棧。

技術分享圖片
#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\n"); } else puts("No"); } }
View Code

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)