HDU4296-ChengduOnling-贪心

某人要搬砖盖一栋楼,有m块砖,每块有两个值w和s,表示重量和强度。楼盖好后每块砖有一个危险值,表示为此砖之上的砖的重量和减此砖的强度,即Σ0(j-1)w - sj。

整体危险值是每块砖危险值的最大值。

这道题当时没想明白就搜了题解,原来是很弱智的一道贪心题。

可以证明,两块砖如果交换后使整体危险值不增加,当且仅当s+w不增加。于是按照s+w值排序,求出最大值即可。

 1 #include <algorithm>
 2 #include <cstring>
 3 #include <ctype.h>
 4 #include <cstdlib>
 5 #include <cstdio>
 6 #include <vector>
 7 #include <string>
 8 #include <queue>
 9 #include <stack>
10 #include <cmath>
11 #include <set>
12 #include <map>
13 
14 using namespace std;
15 
16 int N,M,T;
17 
18 struct Node
19 {
20     int w,s;
21     bool operator < (const struct Node &b) const {return (w+s) < (b.w+b.s);}
22 }save[100010];
23 
24 int main()
25 {
26     while(~scanf("%d",&N))
27     {
28         for(int i=0;i<N;i++) scanf("%d %d",&save[i].w,&save[i].s);
29         sort(save,save+N);
30         long long sum = 0,ans = 0;
31         for(int i=1;i<N;i++)
32         {
33             sum += save[i - 1].w;
34             ans = max(ans,sum-save[i].s);
35         }
36         printf("%lld
",ans);
37     }    
38 }
原文地址:https://www.cnblogs.com/helica/p/4792833.html