[7.24]キャンパス交換ゲームT1およびT2

T1:

穴の大きな脳のタイトルは、うまくすべてのXORの出力までの数を入力します。

(私はXORああを使用したい理由を言います)

#include <ビット/ STDC ++ H> 使用して名前空間STDを、
インラインint型リード(){
     int型 ANS = 0 チャー最後= ' '、CH = GETCHAR()。
    一方、(CH> ' 9 ' || CH < ' 0 ')最後= CH、CH = GETCHAR()。
    一方、(CH> = ' 0 ' && CH <= ' 9 ')ANS =(ANS << 1)+(ANS << 3)+ CH- ' 0 'CH = GETCHAR()。
    もし

 
 (最後== ' - ')ANS = - ANS。
    戻るANSを。
} 

int型N、C。
int型ANS; 

INT (){メイン
    N = 読み取ります()。
    以下のためにint型 i = 1 ; iが<= N; iは++ ){ 
        C = )(読み取ります。
        ANS ^ = C; 
    } 
    のprintf(" %dの" 、ANS)。
    リターン 0 ; 
}

T2:

結論質問:文字列の長さがダウン単なる文字列のみについて2つのエンドポイントを決定し、その最初の行3 ^ K + 1つの値から、3 ^ K + 1であることを起こります。

#include<bits/stdc++.h>

using namespace std;

inline int read() {
    int ans=0;
    char last=' ',ch=getchar();
    while(ch>'9'||ch<'0') last=ch,ch=getchar();
    while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
    if(last=='-') ans=-ans;
    return ans;
}

int n,l;
char a[10000010];
int three[15]= {2,4,10,28,82,244,730,2188,6562,19684,59050,177148,531442,1594324,4782970};

int main() {
    n=read();
    scanf("%s",a+1);
    int len=strlen(a+1);
    while(len>0) {
        for(int i=14; i>=0; i--) if(three[i]<=len) {
                l=three[i];
                break;
            }
        for(int i=1; i<=len-l+1; i++) {
            if(a[i]==a[i+l-1]) continue;
            if(a[i]=='B'&&a[i+l-1]=='G') {
                a[i]='R';
                continue;
            }
            if(a[i]=='B'&&a[i+l-1]=='R') {
                a[i]='G';
                continue;
            }
            if(a[i]=='G'&&a[i+l-1]=='B') {
                a[i]='R';
                continue;
            }
            if(a[i]=='G'&&a[i+l-1]=='R') {
                a[i]='B';
                continue;
            }
            if(a[i]=='R'&&a[i+l-1]=='B') {
                a[i]='G';
                continue;
            }
            if(a[i]=='R'&&a[i+l-1]=='G') {
                a[i]='B';
                continue;
            }
        }
        len=len-l+1;
    }
    printf("%c",a[1]);
}

然后还有一个暴力骗分的方法,只能得到30pts,但在找不出规律时也不失为一种策略(当然tle的部分你可以随便输出‘R’,‘G’,‘B’中的任意一个,应该也可以骗到不少分);

#include<bits/stdc++.h>

using namespace std;

inline int read() {
    int ans=0;
    char last=' ',ch=getchar();
    while(ch>'9'||ch<'0') last=ch,ch=getchar();
    while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
    if(last=='-') ans=-ans;
    return ans;
}

int n;
char a[10000010];

int main() {
    n=read();
    scanf("%s",a+1);
    int len=strlen(a+1);
    while(len>4) {
        for(int i=1; i<=len-3; i++) {
            if(a[i]==a[i+3]) continue;
            if(a[i]=='B'&&a[i+3]=='G') {
                a[i]='R';
                continue;
            }
            if(a[i]=='B'&&a[i+3]=='R') {
                a[i]='G';
                continue;
            }
            if(a[i]=='G'&&a[i+3]=='B') {
                a[i]='R';
                continue;
            }
            if(a[i]=='G'&&a[i+3]=='R') {
                a[i]='B';
                continue;
            }
            if(a[i]=='R'&&a[i+3]=='B') {
                a[i]='G';
                continue;
            }
            if(a[i]=='R'&&a[i+3]=='G') {
                a[i]='B';
                continue;
            }
        }
        len-=3;
    }
    if(len==4) {
        if(a[1]==a[4]) printf("%c",a[1]);
        if(a[1]=='B'&&a[4]=='G') printf("R");
        if(a[1]=='B'&&a[4]=='R') printf("G");
        if(a[1]=='G'&&a[4]=='B') printf("R");
        if(a[1]=='G'&&a[4]=='R') printf("B");
        if(a[1]=='R'&&a[4]=='B') printf("G");
        if(a[1]=='R'&&a[4]=='G') printf("B");
        return 0;
    }
    while(len) {
        for(int i=1; i<=len-1; i++) {
            if(a[i]==a[i+1]) continue;
            if(a[i]=='B'&&a[i+1]=='G') {
                a[i]='R';
                continue;
            }
            if(a[i]=='B'&&a[i+1]=='R') {
                a[i]='G';
                continue;
            }
            if(a[i]=='G'&&a[i+1]=='B') {
                a[i]='R';
                continue;
            }
            if(a[i]=='G'&&a[i+1]=='R') {
                a[i]='B';
                continue;
            }
            if(a[i]=='R'&&a[i+1]=='B') {
                a[i]='G';
                continue;
            }
            if(a[i]=='R'&&a[i+1]=='G') {
                a[i]='B';
                continue;
            }
        }
        len--;
    }
    printf("%c",a[1]);
    return 0;
}
暴力 Code

 

おすすめ

転載: www.cnblogs.com/zhuier-xquan/p/11236843.html