poj3262
正确的应该按照D/T从大到小排序。
证明如下:
任取两头牛i和j,这两头牛需要的总时间为2*(Ti+Tj),在此时间中其他牛吃的花是一定的,因此只要考虑这两头牛就可以了。
若先送牛i,则牛j吃掉的花为2*(Ti*Dj),若先送牛j,则牛i吃掉的花为2*(Tj*Di),我们只要在两者里取个小的就可以了。
注意到T,D是大于0的,因此只要在DJ/TJ和DI/TI里取一个小的。
证毕。
#include <iostream> #include <algorithm> using namespace std; struct node { int t; int d; //int state; }; int cmp(node a ,node b) { return a.d*1.0/a.t > b.d*1.0 /b.t; } node a[100005]; int n; /*int count(int i) { int j; int sum=0; for(j=0;j<n;j++) { if(j!=i && a[j].state==0) sum=sum+a[j].d; } return sum; }*/ int main() { int i; cin>>n; for(i=0;i<n;i++) cin>>a[i].t>>a[i].d; // for(i=0;i<n;i++) // a[i].state=0; sort(a,a+n,cmp); long long sum=0; long long tt=0; for(i=0;i<n;i++) { sum=sum+tt*a[i].d; tt=tt+2*a[i].t;////good,相比于自己写的少了一重循环 } cout<<sum<<endl; return 0; }
坑爹的VC6.0,long long 型在VC6.0中居然不支持,还是codeblocks好使啊