【百度之星】C:度度熊的礼物

时间限制:
1000ms
内存限制:
65536kB
描述

度度熊拥有一个自己的Baidu空间,度度熊时不时会给空间朋友赠送礼物,以增加度度熊与朋友之间的友谊值。度度熊在偶然的机会下得到了两种超级礼物,于是决定给每位朋友赠送一件超级礼物。不同类型的朋友在收到不同的礼物所能达到的开心值是不一样的。开心值衡量标准是这样的:每种超级礼物都拥有两个属性(A, B),每个朋友也有两种属性(X, Y),如果该朋友收到这个超级礼物,则这个朋友得到的开心值为A*X + B*Y。

由于拥有超级礼物的个数限制,度度熊很好奇如何分配这些超级礼物,才能使好友的开心值总和最大呢?

输入
第一行n表示度度熊的好友个数。
接下来n行每行两个整数表示度度熊好朋友的两种属性值Xi, Yi。
接下来2行,每行三个整数ki, Ai, Bi,表示度度熊拥有第i种超级礼物的个数以及两个属性值。
1 <= n <= 1000, 0 <= Xi, Yi, Ai, Bi <= 1000, 0 <= ki <= n, 保证k1+k2 >= n
输出
输出一行一个值表示好友开心值总和的最大值
样例输入
4
3 6
7 4
1 5
2 4
3 3 4
3 4 3
样例输出
118

贪心法,每次给心情最多的一个人最好的礼物。

下面这个例子,来源于网络,就是应付样例。应该不是最终答案,密切关注正解

#include <iostream>
using namespace std;
struct Node
{
    int a,b,n;
}a[2000];
struct Node2
{
    int n,a,b;
}b[2];

int main()
{
    int n,i,j;
    long long sum = 0;
    scanf("%d",&n);//好友个数 
    for(i=0;i<n;i++)//输入每个好友A、B属性 
    {
        scanf("%d%d",&a[i].a,&a[i].b);
        a[i].n = 0;
    }
    scanf("%d%d%d%d%d%d",&b[0].n,&b[0].a,&b[0].b,&b[1].n,&b[1].a,&b[1].b);
    for(i=0;i<n;i++)
    {
        int max = -1;
        int liwu = -1;
        int sj = -1;
        for(j=0;j<n;j++)
        {
            if(a[j].n==1)//已经分配礼物 
                continue;
            int temp1 = b[0].a*a[j].a+b[0].b*a[j].b;//如果没有分配礼物,则选一个高兴值大的 
            int temp2 = b[1].a*a[j].a+b[1].b*a[j].b;
            if(b[0].n>0&&b[1].n>0)
            {
                if(temp1>=temp2&&temp1>max)
                    max = temp1,liwu = 0,sj=j;
                else if(temp2>temp1&&temp2>max)
                    max = temp2,liwu = 1,sj=j;
            } else if(b[0].n>0) //仅有一个 还有礼物余量 
            {
                if(temp1>max)
                    max = temp1,liwu = 0,sj=j;
            } else if(b[1].n>0)
            {
                if(temp2>max)
                    max = temp2,liwu = 1,sj=j;
            }
        }
        if(max!=-1&&liwu!=-1)
        {
            sum += max;
            b[liwu].n--;
            a[sj].n=1;
        }
    }
    printf("%lld\n",sum);
    return 0;
}


 


 

你可能感兴趣的:(c,struct,网络,百度,BI,ini)