Codeforces Round #534 (Div. 2)

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

待补。

猜你喜欢

转载自www.cnblogs.com/mountaink/p/10308640.html