ybt1671

1671:扑克牌

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

【题目描述】

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

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

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

【输入】

第一行给出\(n\)\(b\)

第二行给出\(a_1,a_2,…,a_n\)

【输出】

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

【输入样例】

5 5
5 5 5 5 5

【输出样例】

6

【提示】

【数据规模及约定】

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

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

对于100%的数据,1≤n≤1000000,牌的数量\(≤10^6\)


好久不定代码了,看了题解都做不出!现在继续!继续!


#include<bits/stdc++.h>
using namespace std;
int n,b;
priority_queue<int,vector<int>,greater<int> > q;
//ans:最高高度,cur:能放多少个
int ans,cur;
int main()
{
	scanf("%d%d",&n,&b);
	for(int x,i=1;i<=n;++i)
	{
		scanf("%d",&x);
		q.push(x);
	}
	ans=cur=q.top();
	while(1)
	{
		for(int i=1;i<=cur && b!=0 ;++i,--b)
		{
			int x=q.top();
			q.pop();
			q.push(x+1);
		}
		if(ans==q.top())break;
		cur=q.top()-ans;
		ans=q.top();
	}
	cout<<ans<<endl;
	return 0;
}

posted on 2024-12-10 16:48  gryzy  阅读(6)  评论(0编辑  收藏  举报

导航