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;
}