CDUTCM OJ 2017第一次月賽
阿新 • • 發佈:2019-02-19
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;
}
這就本次月賽的全部題目解答。
對輸入陣列進行排序並從小大到輸出(注意輸出的最後一個後面沒有空格,注意處理)
程式碼如下:
#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;
}
還是簡單題,直接數字符陣列更加方便;
程式碼如下:
#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;
}
這就本次月賽的全部題目解答。