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\n", sum);
33     }
34     return 0;
35 }
时间: 2024-10-03 22:39:05

UvaLive 4863 Balloons(贪心)的相关文章

UVALive 4731 dp+贪心

这个题首先要利用题目的特性,先贪心,否则无法进行DP 因为求期望的话,越后面的乘的越大,所以为了得到最小值,应该把概率值降序排序,把大的数跟小的系数相乘 然后这种dp的特性就是转移的时候,由 i推到i+1每次添加一个数,就要考虑这个新数应该和谁放在一组,枚举他放在哪一组即可 dp[i][j]代表当前第i个数有j个分组时候的最小值 dp[i][j]=dp[k][j-1]+i(prefix[i]-prefix[k-1]),k代表枚举第几个数开始和当前新添加的数为一组,prefix为前缀和,为了迅速得

[Leetcode 452] 最少需要射出多少支箭Minimum Number of Arrows to Burst Balloons 贪心 重载

[题目] There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided input is the start and end coordinates of the horizontal diameter. Since it's horizontal, y-coordinates don't matter and hence the x-coordinates

UVALive 3835:Highway(贪心 Grade D)

VJ题目链接 题意:平面上有n个点,在x轴上放一些点,使得平面上所有点都能找到某个x轴上的点,使得他们的距离小于d.求最少放几个点. 思路:以点为中心作半径为d的圆,交x轴为一个线段.问题转换成用最少的店覆盖所有的线段.经典贪心.按右点从小到大排序,然后从左往右扫,每次选择区间右点就行了. 代码: #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using

UVALive 7146 (贪心+少许数据结构基础)2014acm/icpc区域赛上海站

这是2014年上海区域赛的一道水题.请原谅我现在才发出来,因为我是在太懒了.当然,主要原因是我刚刚做出来. 其实去年我就已经看到这道题了,因为我参加的就是那一场.但是当时我们爆零,伤心的我就再也没有看过那一场的题了.昨天我的队友的高中同学建议我们一起来打一打这场比赛吧,然后我才再次回顾这场比赛.结果一堆琐事,我一共也没有做多久的题,我的队友扎扎实实看了5个小时的题,把另一道水题给过了.全场我们也只过了那么一道题.学姐说,做重现赛和现场赛比较,需要去掉一题,那么我们又爆零了. 题意: 我方有n个人

UVALive 6911---Double Swords(贪心+树状数组(或集合))

题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4923 problem  description Last night, Kingdom of Light was attacked by Kingdom of Dark! The queen of Kingdom of Light, Queen Ar, was ca

UVALive 3664:Guess(贪心 Grade E)

vj题目链接 题意: 有n (n<16345)个人,每个人有三个数(小于1000且最多两位小数点),表示答对对应题的得分.规定总分越高的人rank越高.总分相同,id小的rank高.现在知道rank,问这个rank是否可能,如果可能,那么rank最小的那个人的最大得分是多少. 思路: 3个数,最多8种情况.然后从rank小往上推,每次选择一个最小的能符合条件的分数,当作这个人的分数.如果能推下去,则ok,否则,不能. 坑点: 精度很坑.转成整数才过了. 代码: #include <cstdio

UVALive - 4621 Cav 贪心 + 分析

题目大意:有一张洞穴地图,要在这个洞穴里面存放水,要求水不能碰到洞穴顶部.如今给出每一个位置的顶部位置和地面高度.问最多能够放多少水 解题思路:根据物理定理,每一段有水的连续区间,水位高度必须相等 所以我们能够求出在同一段连续区间內的水位高度,该水位高度等于最低洞穴顶部的高度.以此为根据,从左到右更新,再从右到左更新,就能够得到每一个位置的水位高度了 #include<cstdio> #include<algorithm> using namespace std; const in

I - Defeat the Enemy UVALive - 7146 二分 + 贪心

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5158 这样的受到两个东西限制的,很容易想到要排序,然后加进去multiset,加的时候保证一个key是成立的,就转化为一个key的问题了. 这题需要打死m个全部的军队. 那么应该是枚举m个军队,去找一个n打死它,或者同归于尽. 开始的时候我是枚举n去选m了,这是错误的. 因为

UVALive - 5848 Soju 贪心

题目大意:有两个集合A和B,A集合里面有n个点,B集合里面有m个点,A集合的所有的点的横坐标都比B集合的所有的点的横坐标还小 现在要求在A集合中和B集合中各选择一个点,使得这两点的曼哈顿距离达到最小 解题思路:分析式子abs(x1 - x2) + abs(y1 - y2) 这里假设(x1,y1)是A集合的点,(x2, y2)是B集合的点 因为B集合的点的横坐标都大于A集合的点的横坐标,所有abs(x1 - x2)可化作x2 - x1,现在就要讨论abs(y1 - y2)了 1.假设y2 >= y