1. 程式人生 > >CDUTCM OJ 2017第一次月賽

CDUTCM OJ 2017第一次月賽

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;
}
   
這就本次月賽的全部題目解答。