发布网友 发布时间:2024-10-13 05:00
共3个回答
热心网友 时间:2024-10-13 14:19
你是刚从PASCAL转的C吧,方法没错,只有一个小毛病追答……我承认我那次打错账号了……
你的代码修改后的,首先,你的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
//我记得是贪心