【C++心路历程22】贪心算法 典型模型 保护花卉 usaco contest 08.2

来源:互联网 发布:淘宝网官方网站登入 编辑:程序博客网 时间:2024/04/28 16:02

特点 数据规模大 并且每个元素有两个属性(变量) 能互相影响 对题目要求有两方面
分析方法 考虑两个元素 i j ,比较i-j顺序和j-i顺序的差距 求最优解
1)假设只有 2 头奶牛:
按照 1,2 顺序,损坏花朵的数量为: C12 = 2*cow[1].T * cow[2].D;
按照 2,1 顺序,损坏花朵的数量为: C21 = 2*cow[2].T * cow[1].D;
因此,如果 C12<=C21,则按 1,2 顺序优,否则 2,1 顺序优
2)、假设只有 3 头牛
若 1 应最先被赶走,则需要满足:C12<=C21,C13<=C31
若 2 应最先被赶走,则需要满足:C21<=C12,C23<=C32
若 3 应最先被赶走,则需要满足:C31<=C13,C32<=C23
确定了最先被赶走的牛,则剩下的两头牛转换为 1)的分析(相同子问题
故有比较函数(排序)
bool cmp(data x,data y)
{
int Cxy=2*x.t*y.d;
int Cyx=2*y.t*x.d;
return Cxy<Cyx;
}

再计算即可

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>using namespace std;struct data{    int t,d;    };data a[100005];int n,sum[100005];bool cmp(data x,data y){    int Cxy=2*x.t*y.d;    int Cyx=2*y.t*x.d;    return Cxy<Cyx;}int main(){    //freopen("in.txt","r",stdin);    scanf("%d",&n);    sum[0]=0;    for(int i=1;i<=n;i++)        scanf("%d%d",&a[i].t,&a[i].d);    sort(a+1,a+1+n,cmp);    for(int i=1;i<=n;i++)        sum[i]=sum[i-1]+a[i].d;    long long ans=0;    for(int i=1;i<=n;i++)    {        ans+=(sum[n]-sum[i])*2*a[i].t;    }    cout<<ans;    return 0;}
0 0