链接:题目
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
牛牛有最多50个物品,每个物品有一个type标号,并且有一个taste值,现在要求选择若干个物品放进背包使得x * y最大,x为选择的不同type的数量,y为总的taste值之和
输入描述:
第一行输入一个整数n表示物品的数量(1 ≤ n ≤ 50)
第二行输入 n个整数typei表示每个物品的类型(1 ≤ typei ≤ 100)
第三行输入n个整数tastei(-100000 ≤ tastei ≤ 100000)
输出描述:
输出一个整数
输入:
3
1 2 3
7 4 -1
输出:
30
备注:
子任务一30分:n,m<=10
子任务二30分:n,m<=20
子任务三40分:n,m<=50
思路:
先进行sort排序,按照taste进行降序,因为如果两个物品,type一样,而taste不一样且都为负数,应该先用最大的(因为taste为负数的情况只有增加x方能弥补y的减少,所以type一样,只能选一个),taste为整数则一定加入,看代码
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll N=100;
int n;
struct node
{
int l,w;
bool operator<(const node &rh)const
{
return w>rh.w;
}//定义优先级
}stu[N];
bool vis[N];//标记数组
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>stu[i].l;
}
for(int i=1;i<=n;i++)
{
cin>>stu[i].w;
}
sort(stu+1,stu+1+n);
int x=0,y=0;
for(int i=1;i<=n;i++)
{
if(stu[i].w>=0)//为整数
{
y+=stu[i].w;
if(!vis[stu[i].l])
++x,vis[stu[i].l]=true;//标记
}
else if(!vis[stu[i].l]&&(x+1)*(y+stu[i].w)>x*y)//先判断下是否可以增加x*y
{
x++;
y+=stu[i].w;
vis[stu[i].l]=true;//标记
}
}
cout<<y*x;
return 0;
}