【POJ - 3262】Protecting the Flowers(贪心)

Protecting the Flowers

直接中文

Descriptions

FJ去砍树,然后和平时一样留了 N (2 ≤ N ≤ 100,000)头牛吃草。当他回来的时候,他发现奶牛们正在津津有味地吃着FJ种的美丽的花!为了减少后续伤害,FJ决定立即采取行动:运输每头牛回到自己的牛棚。 每只奶牛i在离牛棚Ti(1 ≤ Ti ≤ 2,000,000) 分钟路程的地方,每分钟吃掉Di(1 ≤ Di ≤ 100)朵花。FJ使尽浑身解数,也只能一次带回一头奶牛。弄回一头奶牛i需要2*Ti分钟(来回)。由于怕被怼,从FJ决定带回i号奶牛开始,i号奶牛就不会吃花。请你找出被毁坏的花的最小数量 .

Input

第一行:N 
第 2.. N+1: 第i+1行是Ti和Di,

Output

Line 1: 被毁坏花的最少数量。保证结果在64位整数范围内

Sample Input

6
3 1
2 5
2 3
3 2
4 1
1 6

Sample Output

86

Hint

FJ的顺序是: 6, 2, 3, 4, 1, 5.当找回6、2、3、4、1、5时,损失花数量分别为24、28、16、12、6、0 。 24 + 28 + 16 + 12 + 6 = 86.
 
题目链接
 
典型的贪心算法,一定是要先送破坏力大的牛回去,怎么来计算谁的破坏力大呢,可以用d/t,算出相对破坏力,按这个从大到小的顺序排序即可,注意要能够用long long
 
AC代码
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 100000+100
using namespace std;
int n;
struct node
{
    int t;//时间
    int d;//破坏力
};
node a[Maxn];
bool cmp(node x,node y)
{
//    破坏力/时间,易得谁的破坏力大,先送破坏力大的回家
    double t1=(x.d*1.0)/(x.t*1.0);
    double t2=(y.d*1.0)/(y.t*1.0);
    return t1>t2;
}
int main()
{
    cin>>n;
//    题目强调了结果在64位整数范围内,注意用ll
    ll sum=0;//全部破坏的花朵数量
    ll ans=0;//最终答案
    for(int i=0; i<n; i++)
    {
        cin>>a[i].t>>a[i].d;
        sum+=a[i].d;
    }
    sort(a,a+n,cmp);//按破坏力从大到小排序
//    排序结果
//    for(int i=0;i<n;i++)
//        cout<<a[i].t<<" "<<a[i].d<<endl;
    for(int i=0; i<n-1; i++)
    {
        sum-=a[i].d;//送哪个走,哪个破坏的花朵数量就不能计算在内,其他的都要乘上这头牛的时间再*2
        ans+=sum*a[i].t*2;
    }
    cout<<ans<<endl;
    return 0;
}

 

posted on 2019-08-05 14:22  Sky丨Star  阅读(475)  评论(0编辑  收藏  举报

导航