标签:
某人要搬砖盖一栋楼,有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\n",ans); 37 } 38 }
标签:
原文地址:http://www.cnblogs.com/helica/p/4792833.html