博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UvaLive 4863 Balloons(贪心)
阅读量:5043 次
发布时间:2019-06-12

本文共 1448 字,大约阅读时间需要 4 分钟。

题意:

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

分析:

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

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

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

1 #include 
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 }

 

转载于:https://www.cnblogs.com/Jadon97/p/7251233.html

你可能感兴趣的文章
玩转storm
查看>>
浅谈 @RequestParam 和@PathVariable
查看>>
NSEnumerator用法小结
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sam做题记录
查看>>
hexo 搭建博客
查看>>
C++的引用
查看>>
python itertools
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
文件操作
查看>>
NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
查看>>
graphite custom functions
查看>>
ssh无密码登陆屌丝指南
查看>>
一个自己写的判断2个相同对象的属性值差异的工具类
查看>>
[CF803C] Maximal GCD(gcd,贪心,构造)
查看>>
oracle连接的三个配置文件(转)
查看>>
Java 8 中如何优雅的处理集合
查看>>
[HNOI2012]永无乡 线段树合并
查看>>