【CQ18阶梯赛第一场】题解
2018-02-22 11:07
218 查看
【A-风格不统一如何写程序】
【B-歌德巴赫猜想】
【C-数组重排2】
【D-方格取数】
输入字符串,得到长度,对于每个字符:如果是大写,则改为:‘_’+小写;如果是‘_’则忽略‘_’,并且把后面的小写改为大写。
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; char c[110]; int main() { int N,len,i; scanf("%d",&N); while(N--){ scanf("%s",c+1); len=strlen(c+1); for(i=1;i<=len;i++){ if(c[i]=='_') { i++; c[i]=toupper(c[i]); } else if(c[i]>='A'&&c[i]<='Z'){ printf("_"); c[i]=tolower(c[i]); } printf("%c",c[i]); } printf("\n"); } return 0; }
【B-歌德巴赫猜想】
两种解法:
一:先把素数筛选出来,然后试探即可。筛选素数一般是埃氏筛法和欧式筛(不会的请自学)。
二:枚举p,q=n-p,然后判断p,q是否是素数。判断一个数X是否是素数的方式是枚举2-sqrt(X),是否能被X整除。
代码是第一种解法的欧氏筛。
#include<cmath> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> using namespace std; const int maxn=1000000; int p[maxn+10],vis[maxn+10],cnt,N; void solve() { for(int i=2;i<=N;i++){ if(!vis[i]) p[++cnt]=i; for(int j=1;j<=cnt&&i*p[j]<=N;j++){ vis[i*p[j]]=1; if(i%p[j]==0) break; } } } int main() { scanf("%d",&N);solve(); for(int i=1;i<=cnt;i++){ if(!vis[N-p[i]]) { printf("%d %d\n",p[i],N-p[i]); return 0; } } }
【C-数组重排2】
显然,题意是要找最大上升子序列长度X,答案就是N-X,所以倒序检验是否是连续下降的,是则X++。
#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<memory> #include<cstring> using namespace std; int a[100010],ans,now; int main() { int i,j,n; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); now=n; for(i=n;i>=1;i--){ if(a[i]==now){ ans++; now--; } } printf("%d\n",n-ans); return 0; }
【D-方格取数】
基础DP(动态规划),为了让两人路径不相交,我们使二人一起走,第一位从(2,1)出发,第二位从(1,2)出发,(保证第一位在第二位的下面,即i>j)在走X步的情况下,第一位走到(i,X-i),第二位走到(j,X-j),用dp[X][i][j]表示二人分别走到(i,X-i) (j,X-j)的最大值。
第一位可能从上面或者左边来,第二位同理。那么X的来源有(i,X-i-1)+(j,X-j-1);(i,X-i-1)+(j-1,X-j); (i-1,X-i)+(j,X-j-1) ; (i-1,X-i-1)+(j-1,X-j);分别取最优解即可。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int dp[410][210][210],a[210][210]; int main() { int n,i,k,j; scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&a[i][j]); dp[3][2][1]=a[1][1]+a[1][1]+a[2][1]+a[1][2]; for(i=4;i<=n+n-1;i++) for(j=1;j<=n;j++) for(k=1;k<=j-1;k++){ dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k-1]); dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]); dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k]); dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k-1]); dp[i][j][k]+=a[j][i-j]+a[k][i-k]; } printf("%d\n",dp[n+n-1] [n-1]+a +a ); return 0; }
相关文章推荐
- 【CQ18阶梯赛第二场】题解
- 【CQ18阶梯赛第8场】题解
- 【CQ18高一暑假前挑战赛5】标程
- 【CQ18高一暑假前挑战赛1】标程
- 【CQ18高一暑假前挑战赛2】标程
- 【CQ18高一暑假前挑战赛3】标程
- 【CQ18高一暑假前挑战赛3.5】标程
- 【CQ18高一暑假前挑战赛4】标程
- BC之旅(18) — 悬崖之路
- 2015国庆第一场——四川省赛练习
- 狗眼看人高【18】
- Jenkins系列之—18 Jenkins升级、迁移和备份
- 《BREW进阶与精通――3G移动增值业务的运营、定制与开发》连载之18---商业模式
- Scala学习笔记18【curry化函数代码示例】
- 细品RibbonX(18):button控件详解
- OC学习笔记 (10-15-18)
- the Secret DAILY TEACHINGS-Day 18
- 九度OJ 1051:数字阶梯求和 (大数运算)
- 条款18:让接口容易被正确使用,不易被误用
- ios开发日记-18上传appStore时,遇到错误,代码为ERROR ITMS-90049