该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第二第三题太狡猾了
第二题居然有重复的路……怪不得只通过30%……
第三题居然可以只吃一部分(一直以为要吃完,题目看上去也是这样)
第一题
因为输入的数极差不大,可以用数组(大小为 (极差+1))存放
#include
int a[201];
int main(){int w,n,s=0,t;scanf("%d%d",&w,&n);
for(int i=n;i--;)scanf("%d",&t),++a[t];
for(int l=0,h=200;n>0;){while(!a[h])--h;
while(!a[l])++l;if(l+h<=w){if(l!=h){if(a[l]
a[h]-=a[l],s+=a[l],n-=a[l]+a[l],a[l]=0;
else a[l]-=a[h],s+=a[h],n-=a[h]+a[h],a[h]=0;
}else n-=a[h],s+=(a[h]+1)>>1,a[h]=0;
}else n-=a[h],s+=a[h],a[h]=0;}printf("%d\n",s);}
第三题
居然可以不吃那么多(题目看了几遍,看得不清楚,或者是我理解能力太差。
最后一遍以为理解了,就是要吃所规定数量的食物)
设a[i]是第1天到第i天最多可以吃的天数
显然,(第一次只吃1,第二次吃2……第a[i]次吃a[i])是最优解(虽然不一定是唯一最优解)
考察a[i+1],如果这天可以吃的食物数大于a[i](上次吃的食物数),则
a[i+1] = a[i] + 1,否则a[i+1] = a[i]
#include
int main()
{
int n, size = 0, t;
for (scanf("%d", &n); n--; )
{scanf("%d", &t);
if (t > size) ++size;
}printf("%d\n", size);}