• 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
    没有梦想,何谈远方
  • 相关阅读:
    Tomcat组件
    Tomcat介绍
    Varnish的VCL
    varnish的架构和日志
    Varnish介绍
    HAProxy的配置
    HAProxy介绍
    KeepAlived的实现示例
    KeepAlived的配置
    vue2.0填坑有感(持续更新ing)
  • 原文地址:https://www.cnblogs.com/zyue/p/3304147.html
Copyright © 2020-2023  润新知