c语言排队接水问题(n人k水龙头)
发布网友
发布时间:2024-10-13 05:00
我来回答
共3个回答
热心网友
时间:2024-10-13 14:19
你是刚从PASCAL转的C吧,方法没错,只有一个小毛病
//for(i=0;i<=n;i++)(n的上限是10000,你申请了102……)
for (i=0;i<102;i++)
{
a[i][1]=a[i][0]=0;
}
如果你要初始化的话,加个<string.h>头文件,memset(a,0,sizeof(a));会更方便
你写的qsort,c语言有这个函数,在<stdlib.h>中,有qsort这个函数,那么你就不用再写了。
编程吧登陆不上去,至于还有什么其他毛病,我就不清楚了追问恩,首先先感谢你上次对我问题的解答。。。我觉得你很厉害哈。那个真的登陆不上去吗。。。
追答……我承认我那次打错账号了……
你的代码修改后的,首先,你的sum和a数组应该定义为long long ,因为该题的最差情况下的和为n*t^2,大概是1万亿的数量级,超过了int的上限约21亿。还有,我说的初始化,以及qsort,我不确定你写的是不是完全对(因为我的QSORT风格跟你不一样),但是,用C语言的库函数确实比你的更快,更安全,更省空间。这是测试过的代码
#include
#include
/*void qs(int s,int e,int k[])
{
int t,i=s,l=e;
t=k[s];
if(i>=l)
return;
while(i=t)--l;
k[i]=k[l];
while(i<l&&k[i]<=t)++i;
k[l]=k[i];
}
k[i]=t;
qs(s,i-1,k);
qs(i+1,e,k);
}*/
int cmp (const void *aa,const void *bb) //比较函数,要注意的是,输入输出的都必须是指针,一个字都不能少,否则编译不成功,背下来好了,a-b是升序,b-a是降序
{
return *(int *)aa-*(int *)bb;
}
main()
{
int i,m,n,b[10005],k;
long long sum,a[102][2];
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&n,&k);
for(i=0;i<102;i++)
{
a[i][1]=a[i][0]=0;
}
for(i=1;i<=n;i++)
{
scanf("%d",&b[i]);
}
//qs(1,n,b);
qsort (b,n+1,sizeof (b[0]),cmp);
for(i=1;i<=n;i++)
{
a[i%k][0]+=b[i];
a[i%k][1]=a[i%k][0]+a[i%k][1];
}
for(i=0,sum=0;i<k;i++)
{
sum=sum+a[i][1];
}
printf("%Ld\n",sum);
}
return 0;
}
热心网友
时间:2024-10-13 14:20
高精度问题吧,sum可能会溢出,不知道你们学校的OJ是用__int64还是long long,试下吧追问额。。。。那怎么改
追答把a[][]和sum改成long long,输入sum时,改成%ld
热心网友
时间:2024-10-13 14:20
//我记得是贪心
c语言排队接水问题(n人k水龙头)
你是刚从PASCAL转的C吧,方法没错,只有一个小毛病 //for(i=0;i<=n;i++)(n的上限是10000,你申请了102……)for (i=0;i<102;i++){ a[i][1]=a[i][0]=0;} 如果你要初始化的话,加个<string.h>头文件,memset(a,0,sizeof(a));会更方便 你写的qsort,c语言有这个函数,...
C语言排队接水
} avg=avg/n;fprintf(opt,"\n%.2f\n",avg);fclose(opt);fclose(ipt);}
接水问题代码求注释
{ scanf("%d",&b[i]);} 这段表示m个水龙头同时开始接水。比如样例1,共三个水龙头,即前三个人开始接水,且水龙头放水时长为b[0]、b[1]、b[2]分别为4、4、1 for(;i<n;i++){ scanf("%d",&a);b[min(b,m)]+=a;} 这段就是整段程序的精髓,这段就是每次一个人接水的水龙头...
跪求noip2010接水问题的代码,C++的,哪位编程高手教教小弟吧。。。_百度...
include <stdio.h> int main(){ freopen("water.in","r",stdin);freopen("water.out","w",stdout);int n,m,i,j,a[10001],b[101],bmax,mn,mk,k;scanf("%d%d",&n,&m);for (i=0;i<n;i++)scanf("%d",&a[i]);for (i=0;i<m;i++)b[i]=a[i];for (i=m;i<n;...
跪求noip2010普及 接水问题(water)程序代码,望哪位高手帮帮忙谢谢啊...
begin tmp:=heap[k];while (k shl 1<=m) do begin kk:=k shl 1;if (kk+1<=m)and(heap[kk]>heap[kk+1]) then inc(kk);if heap[kk]<heap[k] then begin heap[k]:=heap[kk];k:=kk;end else break;end;heap[k]:=tmp;end;begin fillchar(heap,sizeof(heap),0);readln(...
有5个人拿着不同的水桶在一个水龙头前排队打水,前面的人接满后离开...
故选C.【分析】根据该问题的“隐含”假设条件.一是水龙头的供水速度不变,是一个常数;二是每个排队接水的人都在自己的桶接满了水才走.这样一来,可以明确用大水桶接水的人,接水时间就长,用小水桶接水的人,接水时间就短.经过简单的计算,就可以知道:排队打水的最优化排队方案就是:到水龙头...
求编程好手来! Free Pascal排队接水问题
你快排都写错了……原程序 procedure qsort(v1,v2:longint);var i,j,mid,temp:longint;begin i:=v1; j:=v2; mid:=t[(i+j) div 2];while i<j do begin while t[i]<mid do inc(i);while t[j]>mid do dec(j);if i<=j then begin temp:=t[i];t[i]:=t[j];t[j]:...
有5个人拿着不同的水桶在一个水龙头前排队打水,前面的人接满后离开...
由题意,前面的人接满后离开,后面的人才能继续接水所以有:到水龙头打水的人,打水时间最短的排在前面就可以.从而最短时间为1+(1+1.1)+(1+1.1+1.2)+(1+1.1+1.2+1.5)+(1+1.1+1.2+1.5+1.8)=17.8故选C.
三位学生同时打开了三个水龙头,怎么安排才好?
对于三位学生同时打开三个水龙头的问题,我们可以采用排队接水的方式来解决。假设三位学生的接水需求分别为1分钟、3分钟、4分钟,我们可以按照以下步骤进行:安排1分钟的学生:让1分钟的学生先去接水,其他人等待。安排3分钟的学生:1分钟的学生回来后,让3分钟的学生去接水,剩下的人等待。安排4分钟的...
同学们排队接水,水龙头只有一个,李明接满要8分钟,王华接满要6分钟...
第一个小刚,第二个赵丽,第三个王华,第四个李明。3×4+5×3+6×2+8。=12+15+12+8。=47分钟。加法四个基本操作之一,其余的是减法,乘法和除法。 例如,在下面的图片中,共有三个苹果和两个苹果的组合,共计五个苹果。 该观察结果等同于数学表达式“3 + 2 = 5”,即“3加2等于5”。