题意:
给定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 }