SGU 207 Robbers

题意:海盗有n个人,他们预计得到Y个金币,然后第i个人分到xi个金币,然而最后他们得到m个金币,要怎么分使得他们的到的金币与预期的差值(绝对值)的和最小

解题代码:每个人先分到金币预期的向下取整,得到的和肯定小于n,,,然后再根据每个+1以后对和的影响排序,然后把多余的金币z分给前z个人

解题代码:(这里贴上watashi的解题代码)

 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 }
View Code
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/3304147.html