poj3262
一、题意:有n头牛,每头牛每分钟会吃D个菜,把这头牛赶回去需要时间T(人再返回又需要T),一次只能赶回去一头牛,也就是说剩下的牛会继续吃菜。求牛最少吃多少菜
二、思路:贪心。按D/T将牛进行排序,然后计算即可。
三、代码:
1 #include"iostream" 2 #include"stdio.h" 3 #include"algorithm" 4 #include"string.h" 5 using namespace std; 6 7 const int MAXN=100005; 8 typedef long long ll; 9 const ll INF=100000000000; 10 11 int used[MAXN]; 12 struct Cow 13 { 14 int t,d; 15 double div; 16 }; 17 Cow cows[MAXN]; 18 int n; 19 20 bool Cmp(const Cow a,const Cow b) 21 { 22 return a.div>b.div; 23 } 24 ll Solve() 25 { 26 ll res=0; 27 ll sum=0; 28 for(int i=0;i<n;i++) 29 sum+=cows[i].d; 30 for(int i=0;i<n;i++){ 31 sum-=cows[i].d; 32 res+=sum*2*cows[i].t; 33 } 34 return res; 35 } 36 37 int main() 38 { 39 while(scanf("%d",&n)==1) 40 { 41 for(int i=0;i<n;i++){ 42 scanf("%d%d",&cows[i].t,&cows[i].d); 43 cows[i].div=double(cows[i].d)/double(cows[i].t); 44 } 45 sort(cows,cows+n,Cmp); 46 cout<<Solve()<<endl; 47 } 48 return 0; 49 }