题意:海盗有n个人,他们预计得到Y个金币,然后第i个人分到xi个金币,然而最后他们得到m个金币,要怎么分使得他们的到的金币与预期的差值(绝对值)的和最小
解题代码:每个人先分到金币预期的向下取整,得到的和肯定小于n,,,然后再根据每个+1以后对和的影响排序,然后把多余的金币z分给前z个人
解题代码:(这里贴上watashi的解题代码)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 int main() 3 { 4 int re,i,j,k,n,m,y,sum; 5 short int p[1000]; 6 struct robber{ 7 int i,k,x; 8 double r,dif; 9 }a[1000],t; 10 11 scanf("%d",&re); 12 while(re--){ 13 scanf("%d%d%d",&n,&m,&y); 14 sum=0; 15 for(i=0;i<n;i++){ 16 scanf("%d",&a[i].x); 17 a[i].i=i; 18 a[i].r=(double)a[i].x/y; 19 a[i].k=(int)(m*a[i].r); 20 a[i].dif=(double)(2*a[i].k+1)/m-2*a[i].r;//|(k+1)/m-x/y|-|k/m-x/y| 21 sum+=a[i].k; 22 } 23 sum=m-sum; 24 for(i=0;i<n;i++){ 25 k=i; 26 for(j=i+1;j<n;j++) 27 if(a[j].dif<a[k].dif) k=j; 28 t=a[i];a[i]=a[k];a[k]=t; 29 if(i<sum) a[i].k++; 30 } 31 for(i=0;i<n;i++){ 32 for(j=i;j<n;j++) 33 if(a[j].i==i) break; 34 t=a[i];a[i]=a[j];a[j]=t; 35 } 36 printf("%d",a[0].k); 37 for(i=1;i<n;i++) 38 printf(" %d",a[i].k); 39 printf(" "); 40 } 41 }