赶吃花的牛 USACO

来源:互联网 发布:什么叫大数据 编辑:程序博客网 时间:2024/06/05 09:01

【问题描述】

小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   一个整数,最少吃掉的花朵数。
原创粉丝点击