竞赛排名c语言编程,吧内编程竞赛:成绩公布

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

第二第三题太狡猾了

第二题居然有重复的路……怪不得只通过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);}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值