[2010年NOIP普及组] 接水问题
[2010年NOIP普及组] 接水问题
思路:用贪心算法。分为两种情况,第一种是水龙头数多,一次就能都打完,直接输出用时最长的即可;第二种是人数多,需要一个接一个的接水,所以每次都要找出能先打完的水龙头,让后面的人接上,最后找出用时最长的水龙头。
(还要写两个函数,一个找数最大的,另一个找最小的)
代码如下:
#include <stdio.h>
int a[100+10];//水龙头数
int b[10000+10];//人数
int findmax(int *a,int b,int e){//找大的
int i;
int max=0;
int k;
for(i=b;i<=e;i++)
if(max<a[i]){
max=a[i];
k=i;
}
return k;
}
int findmin(int *a,int b,int e){//找小的
int i;
int min=999999;
int k;
for(i=b;i<=e;i++)
if(min>a[i]){
min=a[i];
k=i;
}
return k;
}
int main(){
int i,j;
int n,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
if(n<=m){//水龙头数多
j=findmax(b,1,n);
printf("%d\n",b[j]);
}else{//人数多
for(i=1;i<=m;i++)
a[i]=b[i];//将水龙头的值赋上第一批同学打水的时间
for(i=m+1;i<=n;i++){//加入后续打水学生
j=findmin(a,1,m);//找每次最先打完水的水龙头
a[j]+=b[i];//下一个接水的同学接上
}
j=findmax(a,1,m);//找出用时最长的水龙头序号
printf("%d\n",a[j]);//输出时间
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通