1. 程式人生 > >洛谷P2878 [USACO07JAN]保護花朵Protecting the Flowers

洛谷P2878 [USACO07JAN]保護花朵Protecting the Flowers

con lld fabs sum iomanip algorithm getchar 方法 ons

洛谷P2878 [USACO07JAN]保護花朵Protecting the Flowers

貪心

這題的話 如果研究一下相鄰的兩個 看看交換的結果就好 好像是一種很經典的方法啊、、

如果x後拿的多一點 2Tx*Dy<=2Ty*Dx 所以當Dy/Ty<=Dx/Tx時 x應該在y前面被拿

排序一下就好了

 1 #include <cstdio> 
 2 #include <cmath>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <iostream> 
 6 #include <iomanip> 
 7
#include <string> 8 #include <algorithm> 9 #define LL long long 10 #define For(i,j,k) for(int i=j;i<=k;i++) 11 #define Dow(i,j,k) for(int i=j;i>=k;i--) 12 using namespace std ; 13 14 const int N = 100011 ; 15 const double eps = 1e-7 ; 16 struct node{ 17 int T,D ; 18 }a[N];
19 int n,sum ; 20 LL ans ; 21 22 inline int read() 23 { 24 int x = 0 , f = 1 ; 25 char ch = getchar() ; 26 while(ch<0||ch>9) { if(ch==-) f = -1 ; ch = getchar(); } 27 while(ch>=0&&ch<=9) { x = x * 10+ch-48 ; ch = getchar(); } 28 return x * f ; 29
} 30 31 inline bool cmp(node a,node b) 32 { 33 if(fabs(1.0*a.T/a.D-1.0*b.T/b.D)>eps) // 註意要特判比值相等的情況 34 return 1.0*a.T/a.D < 1.0*b.T/b.D ; 35 return a.T < b.T ; 36 } 37 38 int main() 39 { 40 n = read() ; 41 For(i,1,n) a[i].T=read() , a[i].D=read(),sum+=a[i].D ; 42 sort(a+1,a+n+1,cmp) ; 43 44 For(i,1,n) { 45 sum-=a[i].D ; 46 ans=ans+2*a[i].T*sum ; 47 } 48 printf("%lld\n",ans) ; 49 return 0 ; 50 }

洛谷P2878 [USACO07JAN]保護花朵Protecting the Flowers