【问题描述】
小v出去砍伐,让N头牛在草地上吃草。当他回来时吃惊的看到这些牛全部都跑到花园里在吃他的美丽花朵。他立即去把每头牛赶回它的牛栏(小v的初始位置是牛栏),每次他只能赶一头牛。
i号牛每分钟要吃掉D_i朵花,距离自己的栏地要T_i分钟路程。不幸的是小v每次只能赶一头牛回栏,再回到花园。请问这些牛最少要吃掉多少朵花?我们认为,一旦宁智贤在牛栏处定位到要赶的某头牛后,首先会大喊一声,然后这头牛就失去了吃花的能力,乖乖的等待宁智贤来将自己赶回牛栏。
数据范围
2 <= N <= 100,000
1 <= T_i <= 2,000,000
1 <= D_i <= 100
输入格式 Input Format | ||
第一行一个数N。 下面N行,每行两个数T_i D_i,表示第i头牛的数据。 |
输出格式 Output Format | ||
一个整数,最少吃掉的花朵数。 |
6
3 1
2 5
2 3
3 2
4 1
1 6
【样例输出】
86
题意:
有n个牛在FJ的花园乱吃。
所以FJ要赶他们回牛棚。
每个牛在被赶走之前每秒吃Di个花朵。赶它回去FJ来回要花的总时间是Ti×2。在被赶走的过程中,被赶走的牛就不能乱吃
思路:
贪心策略,对牛进行排序,排序的标准是,假设牛A与牛B要选一头赶走,我们首先要选择破坏最大的一头牛赶走,留破坏小
的牛。他们的破坏着呢麽计算呢?假设先赶走牛A,那么牛B造成的损失是2×TA×DB,先赶走牛B,那么牛A造成的损失是2×TA×DB,
所以,只要判断TA×DB与TA×DB谁大,就知道该先赶走谁了,所以数组排序的标准就是---Ti×Dj>Tj×Di
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct niu
{
int t,d;
}a[100100];
bool mycmp(niu x,niu y)
{
return (x.d*2*y.t>y.d*2*x.t);//贪心策略
}
int main()
{
//freopen("1111.in","r",stdin);
//freopen("1111.out","w",stdout);
long long n,sum=0,tt=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].t>>a[i].d;
sort(a+1,a+n+1,mycmp);
/*for(int i=1;i<=n;i++)
cout<<a[i].t<<' '<<a[i].d<<endl;*/
for(int i=1;i<=n;i++)
{
sum+=tt*a[i].d;
tt+=a[i].t*2;
}
cout<<sum;
return 0;
}
输出格式 Output Format | ||
一个整数,最少吃掉的花朵数。 |