【贪心】ybtoj1671扑克牌

1671:扑克牌


时间限制: 1000 ms         内存限制: 262144 KB

【题目描述】

一副扑克牌有n张牌。一般你买的一副新扑克牌里除了这n张牌外还会有一些张特殊的牌,如果你不小心弄丢了nn张牌中的某一张,就可以用特殊牌来代替,但是如果你弄丢两张的话就没有办法了,因为特殊牌上的图案是一样的。

现在你得到了很多扑克牌,准确来说,n种牌你各有a1,a2,…,an张,同时你还有b张特殊牌,现在你需要从这些牌中整理出若干副牌供大家使用。整理出的一副牌可以由nn种普通牌各一张组成,也可以由n−1种普通牌各一张再加一张特殊牌组成。

请你设计出一种方案,整理出尽可能多的牌。

【输入】

第一行给出n和b。

第二行给出a1,a2,…,an。

【输出】

输出最多能整理出的牌的副数。

【输入样例】

5 5
5 5 5 5 5

【输出样例】

6

【提示】

【数据规模及约定】

对于20%的数据,1≤n≤100,牌的数量小于100。

对于40%的数据,1≤n≤3000。

对于100%的数据,1≤n≤1000000,牌的数量≤10^{6}

 

每次把特殊牌补充到当前数量最少的那种牌上去,然后记录有多少副牌是利用了特殊牌的,记成ans,然后就可以一直重复这一操作直到没有特殊牌剩余或者有两种普通牌同时不够时,结束。

 

 

代码

#include<bits/stdc++.h>
using namespace std;
priority_queue <int,vector<int>,greater<int> > q;
int n,b;
int main()
{

	scanf("%d%d",&n,&b);	
	int x;
	for(int i=1;i<=n;i++)	
	{
		scanf("%d",&x);
		q.push(x);
	}
	int ans=0;
	for(int i=1;i<=b;i++)
	{
		x=q.top(); q.pop();
		x++; ans++;
		q.push(x);
		int x1=q.top(); q.pop();
		int x2=q.top(); q.pop();
		q.push(x1); q.push(x2);
		if(ans==x1 && x1==x2) break;
	}
	printf("%d",q.top());
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值