CDUTCM OJ 2017第一次月赛

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;
}
   
这就本次月赛的全部题目解答。




猜你喜欢

转载自blog.csdn.net/weixin_38721194/article/details/80571646
OJ
今日推荐