• AtCoder Beginner Contest 122 解题报告


    手速选手成功混进rated only里面的前30名,但是总排名就到110+了...

    A - Double Helix

    #include <bits/stdc++.h>
    #define ll long long
    #define inf 0x3f3f3f3f
    #define il inline
    
    namespace io {
    
    #define in(a) a = read()
    #define out(a) write(a)
    #define outn(a) out(a), putchar('
    ')
    
    #define I_int ll
    inline I_int read() {
        I_int x = 0, f = 1;
        char c = getchar();
        while (c < '0' || c > '9') {
            if (c == '-') f = -1;
            c = getchar();
        }
        while (c >= '0' && c <= '9') {
            x = x * 10 + c - '0';
            c = getchar();
        }
        return x * f;
    }
    char F[200];
    inline void write(I_int x) {
        if (x == 0) return (void) (putchar('0'));
        I_int tmp = x > 0 ? x : -x;
        if (x < 0) putchar('-');
        int cnt = 0;
        while (tmp > 0) {
            F[cnt++] = tmp % 10 + '0';
            tmp /= 10;
        }
        while (cnt > 0) putchar(F[--cnt]);
    }
    #undef I_int
    
    }
    using namespace io;
    
    using namespace std;
    
    #define N 100010
    
    char s[N];
    
    int main() {
    	 scanf("%s",s);
    	 if(s[0] == 'A') putchar('T');
    	 if(s[0] == 'T') putchar('A');
    	 if(s[0] == 'G') putchar('C');
    	 if(s[0] == 'C') putchar('G');
    }
    

    B - ATCoder

    #include <bits/stdc++.h>
    #define ll long long
    #define inf 0x3f3f3f3f
    #define il inline
    
    namespace io {
    
    #define in(a) a = read()
    #define out(a) write(a)
    #define outn(a) out(a), putchar('
    ')
    
    #define I_int ll
    inline I_int read() {
        I_int x = 0, f = 1;
        char c = getchar();
        while (c < '0' || c > '9') {
            if (c == '-') f = -1;
            c = getchar();
        }
        while (c >= '0' && c <= '9') {
            x = x * 10 + c - '0';
            c = getchar();
        }
        return x * f;
    }
    char F[200];
    inline void write(I_int x) {
        if (x == 0) return (void) (putchar('0'));
        I_int tmp = x > 0 ? x : -x;
        if (x < 0) putchar('-');
        int cnt = 0;
        while (tmp > 0) {
            F[cnt++] = tmp % 10 + '0';
            tmp /= 10;
        }
        while (cnt > 0) putchar(F[--cnt]);
    }
    #undef I_int
    
    }
    using namespace io;
    
    using namespace std;
    
    #define N 100010
    
    char s[N];
    
    bool check(char c) {
    	if(c == 'A') return 1;
    	if(c == 'G') return 1;
    	if(c == 'T') return 1;
    	if(c == 'C') return 1;
    	return 0;
    }
    
    int main() {
    	 scanf("%s",s); int cnt = 0, ans = 0, n = strlen(s);
    	 for(int i = 0; i < n; ++i) {
    	 	if(check(s[i])) ++cnt;
    	 	else ans = max(ans, cnt), cnt = 0;
    	 }
    	 ans = max(ans, cnt);
    	 outn(ans);
    }
    
    

    C - GeT AC

    这个C怎么比B还简单...

    #include <bits/stdc++.h>
    #define ll long long
    #define inf 0x3f3f3f3f
    #define il inline
    
    namespace io {
    
    #define in(a) a = read()
    #define out(a) write(a)
    #define outn(a) out(a), putchar('
    ')
    
    #define I_int ll
    inline I_int read() {
        I_int x = 0, f = 1;
        char c = getchar();
        while (c < '0' || c > '9') {
            if (c == '-') f = -1;
            c = getchar();
        }
        while (c >= '0' && c <= '9') {
            x = x * 10 + c - '0';
            c = getchar();
        }
        return x * f;
    }
    char F[200];
    inline void write(I_int x) {
        if (x == 0) return (void) (putchar('0'));
        I_int tmp = x > 0 ? x : -x;
        if (x < 0) putchar('-');
        int cnt = 0;
        while (tmp > 0) {
            F[cnt++] = tmp % 10 + '0';
            tmp /= 10;
        }
        while (cnt > 0) putchar(F[--cnt]);
    }
    #undef I_int
    
    }
    using namespace io;
    
    using namespace std;
    
    #define N 100010
    
    int n = read(), q = read();
    int sum[N];
    char s[N];
    
    int main() {
    	 scanf("%s",s+1);
    	 for(int i = 1; i <= n; ++i) {
    	 	sum[i] = sum[i - 1];
    	 	if(s[i]=='C'&&s[i-1]=='A') {
    	 		++sum[i];
    		 }
    	 }
    	 while(q--){
    	 	int l = read(), r = read();
    	 	outn(sum[r]-sum[l]);
    	 }
    }
    

    D - We Like AGC

    全场唯一有点意思的题了...直接考虑太麻烦了,dp一下。
    (f[i][j][a][b])表示位置i,i字符j,i-1字符a,i-2字符b。
    利用map来简化判断过程: mp[1]='A'; mp[2]='C';mp[3]='G';mp[4]='T'
    利用string重载了加法这个特性,也可以简化判断过程。
    然后思考一下就会发现不合法的判定情况就6种(虽然我想+调了要半小时...),如下(a,b,c,d的位置是递增的)

    map<int,string>mp;
    bool check(int a,int b,int c, int d) {
    	
    	if(mp[a]+mp[c]+mp[b]=="AGC") return 0;
    	if(mp[a]+mp[b]+mp[d]=="AGC") return 0;
    	if(mp[a]+mp[c]+mp[d]=="AGC") return 0;
    	
    	if(mp[b]+mp[c]+mp[d]=="AGC") return 0;
    	if(mp[b]+mp[d]+mp[c]=="AGC") return 0;
    	
    	if(mp[c]+mp[b]+mp[d]=="AGC") return 0;
    	
    	return 1;
    }
    

    所以转移的时候再多枚举一个第i-3位的字符,就可以(O(5^4n))解决这题了。注意要特判(nleq 2)的情况。

    #include <bits/stdc++.h>
    #define ll long long
    #define inf 0x3f3f3f3f
    #define il inline
    
    namespace io {
    
    #define in(a) a = read()
    #define out(a) write(a)
    #define outn(a) out(a), putchar('
    ')
    
    #define I_int ll
    inline I_int read() {
        I_int x = 0, f = 1;
        char c = getchar();
        while (c < '0' || c > '9') {
            if (c == '-') f = -1;
            c = getchar();
        }
        while (c >= '0' && c <= '9') {
            x = x * 10 + c - '0';
            c = getchar();
        }
        return x * f;
    }
    char F[200];
    inline void write(I_int x) {
        if (x == 0) return (void) (putchar('0'));
        I_int tmp = x > 0 ? x : -x;
        if (x < 0) putchar('-');
        int cnt = 0;
        while (tmp > 0) {
            F[cnt++] = tmp % 10 + '0';
            tmp /= 10;
        }
        while (cnt > 0) putchar(F[--cnt]);
    }
    #undef I_int
    
    }
    using namespace io;
    
    using namespace std;
    
    #define N 100010
    const ll mod = 1e9 + 7;
    int n = read();
    ll f[N][5][5][5];
    /*
    f[i][j][a][b]位置i,字符j,i-1字符a,i-2字符b
    
    */
    map<int,string>mp;
    bool check(int a,int b,int c, int d) {
    	
    	if(mp[a]+mp[c]+mp[b]=="AGC") return 0;
    	if(mp[a]+mp[b]+mp[d]=="AGC") return 0;
    	if(mp[a]+mp[c]+mp[d]=="AGC") return 0;
    	
    	if(mp[b]+mp[c]+mp[d]=="AGC") return 0;
    	if(mp[b]+mp[d]+mp[c]=="AGC") return 0;
    	
    	if(mp[c]+mp[b]+mp[d]=="AGC") return 0;
    	
    	return 1;
    }
    
    int main() {
    	if(n<=2) return outn(pow(4,n)), 0;
    	mp[0]='Q'; mp[1]='A'; mp[2]='C';mp[3]='G';mp[4]='T';
    	f[0][0][0][0]=1;
    	 for(int i = 1; i <= n; ++i) 
    	 	for(int j = 1; j <= 4; ++j) 
    	 		for(int a = 0; a <= 4; ++a) 
    	 			for(int b = 0; b <= 4; ++b) 
    	 				for(int l = 0; l <= 4; ++l) 
    	 					if(check(l,b,a,j)) (f[i][j][a][b] += f[i-1][a][b][l]) %= mod;
    	 ll ans = 0;
    	 for(int i = 1; i <= 4; ++i) {
    	 	for(int j = 1; j <= 4; ++j) {
    	 		for(int k = 1; k <= 4; ++k) {
    	 			(ans+=f[n][i][j][k])%=mod;
    			 }
    		 }
    	 }
    	 outn(ans);
    }
    
  • 相关阅读:
    使用Eclipse调试Java程序的10个技巧
    向mysql中插入格式为"yyyyMMdd HH:mm:ss"的时间
    乐观锁和悲观锁
    js验证表单大全
    subclipse版本回滚功能
    (转)Linux(RedHat AS4)下架设subversion(svn)服务器
    Redhat5下安装Apache2与Subversion1.6.15
    (转)深入探讨 Java 类加载器
    (转)Java深度历险(一)——Java字节代码的操纵
    关于SVN 目录结构
  • 原文地址:https://www.cnblogs.com/henry-1202/p/10590327.html
Copyright © 2020-2023  润新知