牛客:牛牛的背包--贪心算法

链接:题目
来源:牛客网

时间限制: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

容艾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值