zoukankan      html  css  js  c++  java
  • UvaLive 4863 Balloons(贪心)

    题意:

    给定n个队伍, 然后A房间有a个气球, B房间有b个气球, 然后给出每个队伍所需要的气球数量和到A B房间的距离, 求把气球全部送到每个队伍的最短距离.

    分析:

    在气球充足的情况下, 那么我们对于每个队伍, 肯定是哪个房间近就取哪个房间的气球。

    但是题目中气球的数目有限, 所以很有可能出现某个时刻第i个队伍到A比较近, 但是A没有气球了, 只能去B拿的这种情况。这样的损失就是他们的距离差。

    所以猜想是先把到A和到B距离差较大的队伍先满足了, 这样就能降低损失, 有这种贪心的思想应该就能求出答案了。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n , a, b;
     4 struct T{
     5     int ned, da,db, dif;
     6     friend bool operator<(T a, T b){//重载小于号 在sort中这样是降序
     7         return a.dif > b.dif;
     8     }
     9 };
    10 T team[10007];
    11 int main(){
    12     while(scanf("%d %d %d", &n, &a, &b) && n){
    13         for(int i = 0; i < n ;i ++){
    14             scanf("%d %d %d", &team[i].ned,&team[i].da,&team[i].db);
    15             team[i].dif = abs(team[i].da-team[i].db);
    16         }
    17         sort(team,team+n);//按到a 到b的差距来排序
    18         int sum = 0;
    19         for(int i = 0; i < n;i++){
    20             int ned = team[i].ned;
    21             if(team[i].da < team[i].db){//如果 到a房间距离比到b房间短, 就先去a取, 没有再去b取
    22                 int v = min(ned, a);
    23                 sum += v * team[i].da + (ned - v) * team[i].db;
    24                 a -= v; b -= (ned - v);
    25             }
    26             else{//如果 到b房间距离比到a房间短, 就先去b取, 没有再去a取
    27                 int v = min(ned,b);
    28                 sum += v * team[i].db + (ned - v) * team[i].da;
    29                 b -= v; a -= (ned - v);
    30             }
    31         }
    32         printf("%d
    ", sum);
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    NYOJ 625 笨蛋的难题(二)
    NYOJ 102 次方求模
    ZJU Least Common Multiple
    ZJUOJ 1073 Round and Round We Go
    NYOJ 709 异形卵
    HDU 1279 验证角谷猜想
    BNUOJ 1015 信息战(一)——加密程序
    HDU 1202 The calculation of GPA
    "蓝桥杯“基础练习:字母图形
    "蓝桥杯“基础练习:数列特征
  • 原文地址:https://www.cnblogs.com/Jadon97/p/7251233.html
Copyright © 2011-2022 走看看