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 输出 - 输出一行一个值表示好友开心值总和的最大值 样例输入
-
43 67 41 52 43 3 43 4 3
样例输出 -
118
#include <iostream> #include <cmath> #include <algorithm> #define Max 1001 int cost[Max],index[Max],n; using namespace std; void swap(int i, int j) { int temp; temp = cost[i]; cost[i] = cost[j]; cost[j] = temp; temp = index[i]; index[i] = index[j]; index[j] = temp; } void sort() { for (int i=0; i<n; i++) { for (int j=n+1; j<n; j++) { if (cost[i]<cost[j]) { swap(i,j); } } } } int main() { cin>>n; int i,x[Max],y[Max]; for (i=0; i<n; i++) { cin>>x[i]>>y[i]; index[i] = i; } int k1,a1,b1,k2,a2,b2; cin>>k1>>a1>>b1>>k2>>a2>>b2; int value[Max][2]; for (i=0; i<n; i++) { value[i][0] = x[i]*a1 + y[i]*b1; value[i][1] = x[i]*a2 + y[i]*b2; cost[i] = abs(value[i][0] - value[i][1]); } sort(); int maxValue=0; for (i=0; i<n; i++) { if (k1==0) { for (int j=i; j<n; j++) { maxValue += value[index[j]][1]; } break; } else if (k2==0) { for (int j=i; j<n; j++) { maxValue += value[index[j]][0]; } break; } else { if (value[i][0] > value[i][1]) { maxValue += value[index[i]][0]; k1--; } else { maxValue += value[index[i]][1]; k2--; } } } printf("%d\n",maxValue); return 0; }