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 }
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 }
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 }
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 }
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 }
一点想法💡:为什么2013年的这么这么这么简单!!!!虽然我菜,但是我至少有思路,有AC的可能性……这几年的CSP……真的越来越难顶orzzzz……菜是原罪了
T1 T2 T3超级无敌大水题,T4 简单数位dp T5 简单dfs
这种难度再来一次好嘛???