2012百度之星初赛之C题:度度熊的礼物

度度熊希望利用两种特殊礼物让朋友们最开心。通过计算每位朋友收到不同礼物的快乐值,度度熊需要确定最佳礼物分配方案以最大化整体快乐值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;  
}  
代码没提交,也不知道是对是错!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值