CSP2013-12

  CSP201312-1 出现次数最多的数

 

 

   水题……

 1 //
 2 //  main.cpp
 3 //  CSP201312-1 出现次数最多的数
 4 //
 5 //  Created by sylvia on 2021/10/11.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 //#include<bits/stdc++.h>
10 #include <iostream>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <algorithm>
14 #include <math.h>
15 #include <string.h>
16 
17 using namespace std;
18 #define MAX 10000+5
19 int num[MAX];
20 int maxx=-1,ans=0,a;
21 int main(){
22     int n;
23     memset(num,0,sizeof(num));
24     scanf("%d",&n);
25     register int i,j;
26     for (i=1;i<=n;++i){
27         scanf("%d",&a);
28         ++num[a];
29         if(maxx<num[a]){
30             maxx=num[a];
31             ans=a;
32         }
33         else if (maxx==num[a]){
34             if (a<ans) {
35                 ans=a;
36             }
37         }
38     }
39     printf("%d\n",ans);
40     return 0;
41     
42 }
View Code

 

 

  CSP201312-2 ISBN号码

 

 

  大水题……

 1 //
 2 //  main.cpp
 3 //  CSP201312-2 ISBN号码
 4 //
 5 //  Created by sylvia on 2021/10/11.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <algorithm>
13 #include <math.h>
14 #include <string.h>
15 
16 using namespace std;
17 #define MAX 10000+5
18 int ans=0;
19 int main(){
20     char c[15];
21     register int i;
22     cin>>c;
23     for (i=0;i<=10;i++){
24         int b=c[i]-'0';
25         if(i==0) ans+=(i+1)*b;
26         if(i>1&&i<5) ans+=i*b;
27         if(i>5) ans+=(i-1)*b;
28     }
29     ans%=11;
30     if (ans==10){
31         if(c[12]=='X') cout<<"Right"<<endl;
32         else {
33             c[12]='X';
34             cout<<c<<endl;
35         }
36     }
37     if(ans!=10){
38         if(c[12]==ans+'0') cout<<"Right"<<endl;
39         else {
40             c[12]=ans+'0';
41             cout<<c<<endl;
42         }
43     }
44     return 0;
45 }
View Code

 

 

  CSP201312-3 最大的矩形

 

 

 

 

  超级大水题……

 1 //
 2 //  main.cpp
 3 //  CSP201312-3 最大的矩形
 4 //
 5 //  Created by sylvia on 2021/10/12.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <math.h>
13 #include <string.h>
14 #include <algorithm>
15 
16 using namespace std;
17 #define MAX 1000+5
18 #define LL long long
19 int h[MAX],num1[MAX],num2[MAX],num[MAX];
20 int n;
21 LL ans=0,cnt;
22 int count1=0,count2;
23 int main(){
24     register int i,j,k;
25     memset(num1,0,sizeof(num1));
26     memset(num2,0,sizeof(num2));
27     memset(num,0,sizeof(num));
28     scanf("%d",&n);
29     for (i=1;i<=n;++i){
30         scanf("%d",&h[i]);
31     }
32     for (i=1;i<=n;++i){
33         j=i-1;
34         k=i+1;
35         count1=count2=0;
36         while(h[j]>=h[i]){
37             count1++;
38             j--;
39         }
40         while(h[k]>=h[i]){
41             count2++;
42             k++;
43         }
44         cnt=count1+count2+1;
45         ans=max((LL)cnt*h[i],ans);
46     }
47     printf("%lld\n",ans);
48     return 0;
49 }
View Code

 

  CSP201312-4 有趣的数

 

  终于不是水题了(bushi 

  起初看错了题意,以为这四个数仅出现一次,剩余的数可填,lan后就用组合数写了……,lan后它就WA了……

  去网上一搜,大家都说是数位dp,然后考虑dp怎么做,于是有了以下思路qwq(这几年没敲代码退步了不少……这种水题居然都不会做了……)

  既然只有这四个数,并且要求01,23有出现顺序要求,且0不可在第一位,辣么第一位一定是2,于是就有了5个状态

  f[i][0] 2 表示前i位只有2

  f[i][1] 2,0 前i位只有2,0     可由f[i-1][0]&f[i-1][1]转移而来,并且分别在当前位可填入的数字是0或0/2 

  剩余的3个状态和转移方程及可填数字见代码注释部分……可填数字的数量决定了是否*2

  lan后递推就成了,就介么简单qwq,再次感叹自己水平退化orzzzzz

 1 //
 2 //  main.cpp
 3 //  CSP201312-4 有趣的数
 4 //
 5 //  Created by sylvia on 2021/10/12.
 6 //  Copyright © 2021 apple. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <math.h>
13 #include <string.h>
14 #include <algorithm>
15 
16 using namespace std;
17 #define MAX 1000+5
18 #define LL long long
19 #define MOD 1000000007
20 int n;
21 LL ans;
22 LL f[MAX][6];
23 //状态方程  表示的状态 哪个状态转移而来 可填数字
24 //f[i][0] 2
25 //f[i][1] 2,0       --[0][1]      0,0\2
26 //f[i][2] 2,3       --[2][0]      3,
27 //f[i][3] 2,0,1     --[1][3]      1,1\2
28 //f[i][4] 2,0,3     --[1][2][4]   3,0,0\3
29 //f[i][5] 2,0,3,1   --[3][4][5]   3,1,1\3
30 int main(){
31     scanf("%d",&n);
32     memset(f,0,sizeof(f));
33     f[1][0]=1;
34     for (int i=2;i<=n;++i){
35         f[i][0]=1;
36         f[i][1]=(f[i-1][0]+f[i-1][1]*2)%MOD;
37         f[i][2]=(f[i-1][0]+f[i-1][2])%MOD;
38         f[i][3]=(f[i-1][1]+f[i-1][3]*2)%MOD;
39         f[i][4]=(f[i-1][1]+f[i-1][2]+f[i-1][4]*2)%MOD;
40         f[i][5]=(f[i-1][3]+f[i-1][4]+f[i-1][5]*2)%MOD;
41         
42     }
43     
44     printf("%lld\n",f[n][5]%MOD);
45     return 0;
46 }
View Code

 

  CSP201312-5 I’m stuck!

 

 

 

 

 

 这题做得我心烦气躁qwq(其实是自己太弱了)

可以很简单的看出是dfs,分两次dfs,第一次dfs从起点开始,将经过的点打上标记,在第一次结束后可以根据是否到达过终点直接判断会不会stuck,第二次dfs是从终点开始,起初直接用了第一次的dfs,结果发现倒推是有讲究的,比如在T本身可以上下左右走,但是倒推就得判断周边四个点是否是能到达T点的,如果能到达才能去遍历这个点打标记

完事后提交发现只有30分……,我WA得一声就哭出来了orzzzzz,

debug了半个多小时,才发现是case里面没写break……!!!

  1 //
  2 //  main.cpp
  3 //  CSP201312-5 I’m stuck!
  4 //
  5 //  Created by sylvia on 2021/10/13.
  6 //  Copyright © 2021 apple. All rights reserved.
  7 //
  8 
  9 #include <iostream>
 10 #include <stdio.h>
 11 #include <stdlib.h>
 12 #include <math.h>
 13 #include <string.h>
 14 #include <algorithm>
 15 // 1  不动
 16 // 2  上下左右
 17 // 3  左右
 18 // 4  上下
 19 // 5  下
 20 // 9 S
 21 // 10 T
 22 using namespace std;
 23 #define MAX 50+5
 24 #define LL long long
 25 int a[MAX][MAX];
 26 int r1,c1,r2,c2;
 27 int r,cc;
 28 int flag=0;
 29 int ans=0;
 30 pair<int,int> f[MAX][MAX];
 31 void dfs1(int r,int c,int how){
 32         if(f[r][c].first==2||how==0||how==1) return;
 33         if(how==10){
 34             flag=1;
 35         }
 36         switch(how){
 37             case 2:{//上下左右
 38                 f[r][c].first=2;
 39                 dfs1(r-1,c,a[r-1][c]);
 40                 dfs1(r,c-1,a[r][c-1]);
 41                 dfs1(r+1,c,a[r+1][c]);
 42                 dfs1(r,c+1,a[r][c+1]);
 43                 break;
 44             }
 45             case 3:{//左右
 46                 f[r][c].first=2;
 47                 dfs1(r,c+1,a[r][c+1]);
 48                 dfs1(r,c-1,a[r][c-1]);
 49                 break;
 50             }
 51             case 4:{//上下
 52                 f[r][c].first=2;
 53                 dfs1(r-1,c,a[r-1][c]);
 54                 dfs1(r+1,c,a[r+1][c]);
 55                 break;
 56             }
 57             case 5:{ //
 58                 f[r][c].first=2;
 59                 dfs1(r+1,c,a[r+1][c]);
 60                 break;
 61             }
 62             case 9:{
 63                 f[r][c].first=2;
 64                 dfs1(r-1,c,a[r-1][c]);
 65                 dfs1(r,c-1,a[r][c-1]);
 66                 dfs1(r+1,c,a[r+1][c]);
 67                 dfs1(r,c+1,a[r][c+1]);
 68                 break;
 69                 }
 70             case 10:{
 71                 f[r][c].first=2;
 72                 dfs1(r-1,c,a[r-1][c]);
 73                 dfs1(r,c-1,a[r][c-1]);
 74                 dfs1(r+1,c,a[r+1][c]);
 75                 dfs1(r,c+1,a[r][c+1]);
 76                 break;
 77             }
 78         }
 79     return;
 80     }
 81 
 82 void dfs2(int r,int c,int how){
 83     if(how==1||how==0||f[r][c].second==-1) return;
 84     f[r][c].second=-1;
 85     int up=a[r-1][c];
 86     int down=a[r+1][c];
 87     int left=a[r][c-1];
 88     int right=a[r][c+1];
 89     if (up==2||up==4||up==5||up==9||up==10) dfs2(r-1,c,up);
 90     if (down==2||down==4||down==9||down==10) dfs2(r+1,c,down);
 91     if (left==2||left==3||left==9||left==10) dfs2(r,c-1,left);
 92     if (right==2||right==3||right==9||right==10) dfs2(r,c+1,right);
 93     return;
 94     
 95 }
 96 int main(){
 97     register int i,j,k;
 98     memset(f,0,sizeof(f));
 99     memset(a,0,sizeof(a));
100     char c;
101     scanf("%d%d",&r,&cc);
102     getchar();
103     for (i=1;i<=r;i++){
104         for(j=1;j<=cc;j++){
105             c=getchar();
106             switch(c){
107                 case '#':
108                     a[i][j]=1;
109                     break;
110                 case '+':
111                     a[i][j]=2;
112                     break;
113                 case '-':
114                     a[i][j]=3;
115                     break;
116                 case '|':
117                     a[i][j]=4;
118                     break;
119                 case '.':
120                     a[i][j]=5;
121                     break;
122                 case 'S':
123                     a[i][j]=9;
124                     r1=i;
125                     c1=j;
126                     break;
127                 case 'T':
128                     a[i][j]=10;
129                     r2=i;
130                     c2=j;
131                     break;
132             }
133         }
134         getchar();
135     }
136     dfs1(r1,c1,9);
137     dfs2(r2,c2,10);
138     if(!flag) cout<<"I'm stuck!"<<endl;
139     else {
140         for(i=1;i<=r;++i){
141             for(j=1;j<=cc;++j){
142                 if(f[i][j].first+f[i][j].second==2){
143                     ans++;
144                 }
145             }
146         }
147         cout<<ans<<endl;
148         
149     }
150     return 0;
151 }
View Code

 

 

一点想法💡:为什么2013年的这么这么这么简单!!!!虽然我菜,但是我至少有思路,有AC的可能性……这几年的CSP……真的越来越难顶orzzzz……菜是原罪了

T1 T2 T3超级无敌大水题,T4 简单数位dp  T5 简单dfs

这种难度再来一次好嘛???

 

 

posted @ 2021-10-12 18:53  Sylvia_lee  阅读(45)  评论(0编辑  收藏  举报