• 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 }
  • 相关阅读:
    linksys wrt160nv3 刷dd-wrt固件
    win2008 r2 远程桌面问题
    windows server 2008 集成raid卡驱动
    gitlab-ce
    git
    批量发布jar包springboot应用
    gradle
    lvs
    rsyslog
    特殊权限
  • 原文地址:https://www.cnblogs.com/Jadon97/p/7251233.html
Copyright © 2020-2023  润新知