题意:
有n头牛在花园里吃花朵,老头要一个一个赶走他们,赶走的时候别的牛仍然在吃.
现在问最小的损失是什么。
重点内容
输入的第一行是牛的头数,然后n行每行两个数分别是赶走需要的时间
和每单位时间所吃的花。
思路:
有一个证明能很好的说明问题:
如:
两头牛分别是(a,b),(c,d)如果先赶走第一头,那么花费花朵为b*x + (x + a*2)*d,先赶走第二头,花费花朵为d*x + (x + c*2)*b.相减之后为2*a*d - 2*c*b,显而易见,那个花费少就可以当作排序的依据那么就是排序的问题了。
排序很神奇
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
class Node
{
public:
int x,y;
}cow[100005];
int cmp(Node a,Node b)
{
return a.x*b.y < a.y*b.x;
}
int n;
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n; i++){
scanf("%d%d",&cow[i].x,&cow[i].y);
cow[i].x *= 2;
}
sort(cow,cow+n,cmp);
__int64 sum = 0;
__int64 ans = 0;
for(int i = 0;i < n; i++){
ans += sum*cow[i].y;
sum += cow[i].x;
}
printf("%I64d\n",ans);
}
return 0;
}