zoukankan      html  css  js  c++  java
  • 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
    没有梦想,何谈远方
  • 相关阅读:
    2019-9-10做题记录
    2019-9-9做题记录
    【HAOI2008】硬币购物
    【SCOI2010】生成字符串
    第18讲——ActiveX控件
    第20讲 HOOK和数据库编程
    第19讲——动态链接库
    2016-5-22 百度之星第三题--瞬间移动
    2016-4-25 完美世界-实习--小萌的包裹
    第3章 拍摄UFO——单一职责原则
  • 原文地址:https://www.cnblogs.com/zyue/p/3304147.html
Copyright © 2011-2022 走看看