题目链接:
https://nuoyanli.com/contest/25/problem/B
题面:
题意:
输入n场比赛,依次输入每一次比赛的问题数目,要满足第k天做的题目量要大于等于k才可以继续训练,如果不满足就停止训练,选择最佳方案,使得训练时长最久,输出最多训练多少天。
思路:
由题面可知,我们不仅需要判断第k天时是否存在一个比赛的题量大于k,还要满足最佳方案,所以要先对每次的比赛题量进行一次排序,按从小到大的顺序依次排序,然后依次判断是否大于k,如果大于k的话就可以选择此题组(此时判断出来的题目量一定是所有题目量中最接近k的一场比赛的),并将此题组的题目量清0,无法再刷,并不再继续判断是否存在数值大于k,继续依次判断下一天,一旦不存在大于k的题目量,判断结束,输出天数。此时得到的就是最优解。
参考代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
int n,i,m=0,j,temp;
scanf("%d",&n);
int a[n+10];
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
for(i=0; i<n-1; i++)
{
for(j=0; j<n-1; j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}//通过冒泡排序将比赛场的题目量从小到大进行排序
for(i=1; i<=n; i++)
{
m=0;
for(j=0; j<n; j++)
{
if(a[j]>=i)//判断是否存在题目量大于该天的天数
{
a[j]=0;//一旦答完这组题之后该比赛的题量清0
m=1;//标记存在题目量大于该天的天数的情况
break;//一旦存在此数就跳出小循环
}
}
if(m==0)
{
break;//判断是否存在此数,不存在直接跳出大循环
}
}
printf("%d",i-1);//输出最大的训练天数(输出i-1是因为当不满足时i的数值,训练的天数应该为i-1天,当i=n时,要运行完i++再继续判断,所以输出的天数应该为i-1)
return 0;
}