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,牌的数量≤。
每次把特殊牌补充到当前数量最少的那种牌上去,然后记录有多少副牌是利用了特殊牌的,记成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;
}