Codeforces Beta Round #96 (Div. 2) (A-E)

写份DIV2的完整题解

A

判断下HQ9有没有出现过 

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 112
12 #define LL long long
13 #define INF 0xfffffff
14 const double eps = 1e-8;
15 const double pi = acos(-1.0);
16 const double inf = ~0u>>2;
17 char s[N];
18 int main()
19 {
20     int i,j,k;
21     cin>>s;
22     k = strlen(s);
23     for(i = 0; i < k ;i++)
24     if(s[i]=='H'||s[i]=='9'||s[i]=='Q')
25     break;
26     if(i==k)
27     puts("NO");
28     else
29     puts("YES");
30     return 0;
31 }
View Code

B

模拟下就OK

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 112
12 #define LL long long
13 #define INF 0xfffffff
14 #define mod 1000003
15 const double eps = 1e-8;
16 const double pi = acos(-1.0);
17 const double inf = ~0u>>2;
18 char s[N];
19 int a[550];
20 int main()
21 {
22     int i,j,k;
23     a['>'] = 8;
24     a['<'] = 9;
25     a['+'] = 10;
26     a['-'] = 11;
27     a['.'] = 12;
28     a[','] = 13;
29     a['['] = 14;
30     a[']'] = 15;
31     cin>>s;
32     k = strlen(s);
33     int ans = 0;
34     for(i = 0;i < k ; i++)
35     {
36        // cout<<a[s[i]]<<endl;
37         ans = (ans*16+a[s[i]])%mod;
38     }
39     cout<<ans<<endl;
40     return 0;
41 }
View Code

C

题意有点费解 给定操作 使其数字变为字符 先给你字符 问原先数字为多少 模拟。。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 112
12 #define LL long long
13 #define INF 0xfffffff
14 #define mod 256
15 const double eps = 1e-8;
16 const double pi = acos(-1.0);
17 const double inf = ~0u>>2;
18 char s[N];
19 int a[550];
20 int main()
21 {
22     int i,j,k;
23     gets(s);
24     k = strlen(s);
25     int ans = 0;
26     int kt = 0;
27     for(i = 0;i < k ; i++)
28     {
29        int x = s[i];
30        int y = kt;
31        int g = 0;kt=0;
32        memset(a,0,sizeof(a));
33        while(y)
34        {
35            a[g++] = y%2;
36            y/=2;
37        }
38        for(j =0 ; j < 8 ;j++)
39        kt+=pow(2,8-j-1)*a[j];
40        memset(a,0,sizeof(a));
41        g = 0;
42        while(x)
43        {
44            a[g++] = x%2;
45            x/=2;
46        }
47        int ans = 0 ;
48        for(j = 0 ; j < 8 ;j++)
49        ans+=pow(2,8-j-1)*a[j];
50        kt = (kt-ans+mod)%mod;
51        cout<<kt<<endl;
52        kt = s[i];
53     }
54     return 0;
55 }
View Code

D

题意更是费解 大意:你当前在某一个颜色块中 你有两个指向标  一个是向另一块前进的方向 另一个是在本块的前进方向 0块和边外不能走 问m次后你在哪个块中

模拟。。

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 112
 12 #define LL long long
 13 #define INF 0xfffffff
 14 #define mod 256
 15 const double eps = 1e-8;
 16 const double pi = acos(-1.0);
 17 const double inf = ~0u>>2;
 18 char s[55][55];
 19 int a[55][55][4],n,k;
 20 int judge(int x,int y)
 21 {
 22     if(x<0||x>=n||y<0||y>=k)
 23     return 0;
 24     if(s[x][y]=='0') return 0;
 25     return 1;
 26 }
 27 int main()
 28 {
 29     int i,j,m,g;
 30     cin>>n>>m;
 31     for(i = 0; i < n ;i++)
 32         cin>>s[i];
 33     k = strlen(s[1]);
 34     for(i = 0 ;i < n ;i++)
 35     {
 36         for(j = 0; j < k ;j++)
 37         {
 38             for(g = j ; g >= 0 ; g--)
 39             if(s[i][g]!=s[i][j]) break;
 40             a[i][j][3] = g+1;
 41             for(g = i ; g >= 0; g--)
 42             if(s[g][j]!=s[i][j]) break;
 43             a[i][j][0] = g+1;
 44             for(g = j ; g < k; g++)
 45             if(s[i][g]!=s[i][j]) break;
 46             a[i][j][1] = g-1;
 47             for(g = i ; g < n ;g++)
 48             if(s[g][j]!=s[i][j]) break;
 49             a[i][j][2] = g-1;
 50         }
 51     }
 52     int d1 = 1,d2 = 0,x = 0,y = 0;
 53     char c = s[0][0];
 54     int k1 = 1;
 55     while(k1<=m)
 56     {
 57         if(d1==0||d1==2)
 58         x = a[x][y][d1];
 59         else y = a[x][y][d1];
 60         if(d2==0||d2==2)
 61         x = a[x][y][d2];
 62         else y = a[x][y][d2];
 63         int tx,ty;
 64         if(d1==0)
 65         {
 66             tx = x-1;ty = y;
 67         }
 68         else if(d1==1)
 69         {
 70             tx = x;ty = y+1;
 71         }
 72         else if(d1==2)
 73         {
 74             tx = x+1;ty = y;
 75         }
 76         else
 77         {
 78             tx = x;ty = y-1;
 79         }
 80         if(!judge(tx,ty))
 81         {
 82             //cout<<",";
 83             if((d2+1)%4==d1)
 84             d2 = (d1+1)%4;
 85             else
 86             {
 87 
 88                 d1 = (d1+1)%4;d2 = (d1-1+4)%4;
 89             }
 90         }
 91         else
 92         {
 93             c = s[tx][ty];
 94             x = tx,y = ty;
 95         }
 96         k1++;
 97         //x = tx
 98         //cout<<c<<" "<<d1<<" "<<d2<<" "<<k1<<" "<<x<<" "<<y<<endl;
 99     }
100     cout<<c<<endl;
101     return 0;
102 }
View Code

E

当时的思路貌似不太对 按照zp说的思路又重写了一遍

dp[i][j][0] 表示在i位置已经改变了j次方向为正的最大移动距离 dp[i][j][1]类似表反方向。

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 112
 12 #define LL long long
 13 #define INF 0xfffffff
 14 #define mod 256
 15 const double eps = 1e-8;
 16 const double pi = acos(-1.0);
 17 const double inf = ~0u>>2;
 18 int dp[N][55][2];
 19 char s[N];
 20 int main()
 21 {
 22     int i,j,k;
 23     cin>>s;
 24     cin>>k;
 25     int kk = strlen(s);
 26     for(i = 0 ; i < kk ; i++)
 27         for(j = 0 ; j <= k ; j++)
 28         dp[i][j][0] = dp[i][j][1] = -INF;
 29     if(s[0]=='T')
 30     {
 31         for(i = 0 ; i <= k ; i++)
 32         {
 33             if(i%2!=0)
 34             dp[0][i][1] = -1;
 35             else
 36             dp[0][i][0] = 0;
 37         }
 38     }
 39     else
 40     {
 41         for(i = 0 ; i <= k ; i++)
 42             if(i%2==0)
 43             dp[0][i][0] = 1;
 44             else
 45             dp[0][i][1] = 0;
 46     }
 47     for(i = 1; i < kk ;i++)
 48     {
 49         if(s[i]=='T')
 50         {
 51             dp[i][0][0] = dp[i-1][0][1];
 52             dp[i][0][1] = dp[i-1][0][0];
 53         }
 54         else
 55         {
 56             dp[i][0][0] = dp[i-1][0][0]+1;
 57             dp[i][0][1] = dp[i-1][0][1]-1;
 58         }
 59         for(j = 1; j <= k ; j++)
 60         {
 61             if(s[i]=='T')
 62             {
 63                 dp[i][j][0] = max(dp[i-1][j][1],dp[i-1][j-1][0]+1);
 64                 dp[i][j][1] = max(dp[i-1][j][0],dp[i-1][j-1][1]-1);
 65             }
 66             else
 67             {
 68                 dp[i][j][0] = max(dp[i-1][j][0]+1,dp[i-1][j-1][1]);
 69                 dp[i][j][1] = max(dp[i-1][j][1]-1,dp[i-1][j-1][0]);
 70             }
 71         }
 72     }
 73     int ans1 = max(dp[kk-1][k][0],dp[kk-1][k][1]);
 74     for(i = 0 ; i < kk ; i++)
 75         for(j = 0 ; j <= k ; j++)
 76         dp[i][j][0] = dp[i][j][1] = -INF;
 77     if(s[0]=='T')
 78     {
 79         for(i = 0 ; i <= k ; i++)
 80         {
 81             if(i%2!=0)
 82             dp[0][i][0] = 1;
 83             else
 84             dp[0][i][1] = 0;
 85         }
 86     }
 87     else
 88     {
 89         for(i = 0 ; i <= k ; i++)
 90         if(i%2==0)
 91         dp[0][i][1] = -1;
 92         else
 93         dp[0][i][0] = 0;
 94     }
 95     for(i = 1; i < kk ;i++)
 96     {
 97         if(s[i]=='T')
 98         {
 99             dp[i][0][0] = dp[i-1][0][1];
100             dp[i][0][1] = dp[i-1][0][0];
101         }
102         else
103         {
104             dp[i][0][0] = dp[i-1][0][0]+1;
105             dp[i][0][1] = dp[i-1][0][1]-1;
106         }
107         for(j = 1; j <= k ; j++)
108         {
109             if(s[i]=='T')
110             {
111                 dp[i][j][0] = max(dp[i-1][j][1],dp[i-1][j-1][0]+1);
112                 dp[i][j][1] = max(dp[i-1][j][0],dp[i-1][j-1][1]-1);
113             }
114             else
115             {
116                 dp[i][j][0] = max(dp[i-1][j][0]+1,dp[i-1][j-1][1]);
117                 dp[i][j][1] = max(dp[i-1][j][1]-1,dp[i-1][j-1][0]);
118             }
119         }
120     }
121     int ans2 = max(dp[kk-1][k][0],dp[kk-1][k][1]);
122     //cout<<ans1<<" "<<ans2<<endl;
123     int ans = max(ans1,ans2);
124     cout<<ans<<endl;
125     return 0;
126 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3622253.html