Problem A 求和 题的意思就是输入一个n求1~n的和。 简单题,代码如下: #include<cstdio> using namespace std; int main() { int T,sum,n; scanf("%d",&T); while(T--)//控制循环次数 { scanf("%d",&n); sum=0;//每次循环都要赋一次值 for(int i=1;i<=n;i++) { sum=sum+i; } printf("%d\n",sum); } return 0; } Problem B 钱老师的烦恼 对输入数组进行排序并从小大到输出(注意输出的最后一个后面没有空格,注意处理) 代码如下: #include<cstdio> #include<algorithm>//调用sort函数 using namespace std; int main() { int n,a[100],i; while(~scanf("%d",&n))//实现多次输入 { for(int i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n);//实现快速排序 for(int i=0;i<n-1;i++) { printf("%d ",a[i]); } printf("%d\n",a[n-1]);//单独对最后一个输出,以免多输出空格 } /* for(int i=0;i<n;i++) { printf("%d%c",a[i],i!=n-1?' ':'\n'); } //也可以这样输出,自己参考含义。 */ return 0; } Problem C 突击战 贪心算法:思路,优先安排执行任务时间最长的士兵,以此类推。 代码如下: #include<cstdio> using namespace std; int main() { int a[200],b[200],n,t,k=1,sum; while(~scanf("%d",&n)&&n!=0) { for(int i=0;i<n;i++) { scanf("%d%d",&a[i],&b[i]);//a[i]为交代任务时间,b[i]为完成所需要的时间 } for(int i=0;i<n;i++) { for(int j=0;j<n-i-1;j++) { if(b[i]<b[i+1]) { t=b[i];b[i]=b[i+1];b[i+1]=t; t=a[i];a[i]=a[i+1];a[i+1]=t;//按从大到小排列 } } } sum=a[0]+b[0]; for(int i=1;i<n;i++) { sum+=(a[i]+b[i])-b[i-1]; } printf("Case %d: %d\n",k,sum); k++;//用于计数 } return 0; } Problem D: Sequence 简单题,就是找哪个数出现了2次; 代码如下: #include<cstdio> using namespace std; int main() { int a[100],n,ok; while(~scanf("%d",&n)) { ok=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++)//从第i个数开始往后面找,找到相同输出并退出 { if(a[i]==a[j]) { printf("%d\n",a[i]); ok=1; break; } } if(ok) { break; } } } return 0; } Problem E: 顺逆序输出 还是简单题,直接数字符数组更加方便; 代码如下: #include<cstdio> #include<cstring> using namespace std; int main() { char c[6]; int i,a; scanf("%s",c); a=strlen(c); printf("%d\n",a); for(i=0;i<a-1;i++) { printf("%c ",c[i]); } printf("%c\n",c[a-1]); while(c[a-1]=='0') { a--; }//去掉尾数0; for(i=a-1;i>=0;i--) { printf("%c",c[i]); } printf("\n"); return 0; } Problem F: 最大子串和 本次月赛最难的一道题,需要运用动态规划解决,大体意思如下: 用前i个数的和(1<=i<=n)去减去前j个数的和(0<=j<i)便可解决。 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int a[100000],b[100000]; int main() { int n,c,k; scanf("%d",&n); while(n--) { k=-200; scanf("%d",&c); b[0]=0; for(int i=0;i<c;i++) { scanf("%d",&a[i]); b[i+1]=a[i]+b[i]; } for(int i=1;i<=c;i++) { for(int j=0;j<i;j++) { k=max(max(b[i],b[i]-b[j]),k); } } printf("%d\n",k); } return 0; } 这就本次月赛的全部题目解答。 |
CDUTCM OJ 2017第一次月赛
猜你喜欢
转载自blog.csdn.net/weixin_38721194/article/details/80571646
今日推荐
周排行