题解:
这道题是贪心没错,根据提示的顺序第一眼看过去可能是按照D去排序贪心的,但是很容易举出反例(300,100)(1,1).所以不是那么简单。但是很明显可以知道一定是关于DT的某种关系的贪心,试了一下相乘与相除,相除符合,就直接写了。WA了一次因为结果是LL,这点好像很容易在贪心中用到。
后来看了网上的题解,贪心的证明:牛A和B,选择的时候代价Ta*Db 与 Tb*Da比较,按照这个去贪心,移项后和上面是一样的。
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
const int MAX = 100010;
struct cow{
int T,D;
double priority;
friend bool operator < (cow a,cow b){
return a.priority < b.priority;
}
// friend bool operator < (cow a,cow b){
// return a.T*b.D < a.D*b.T;
// }
};
int N;
LL sum;
int Wait;
cow Lis[MAX];
int main()
{
scanf("%d",&N);
for( int i = 0; i < N; i++ ){
scanf("%d%d",&Lis[i].T,&Lis[i].D);
Lis[i].priority = (Lis[i].T*1.0)/Lis[i].D;
}
sort(Lis,Lis+N);
sum = 0;
Wait = 0;
for( int i = 0; i < N; i++ ){
sum += Lis[i].D*Wait;
Wait += 2*Lis[i].T;
}
printf("%I64d\n",sum);
return 0;
}