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>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
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++)
{
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;
}