一副扑克牌有n张牌。一般你买的一副新扑克牌里除了这n张牌外还会有一些张特殊的牌,如
果你不小心弄丢了n张牌中的某一张,就可以用特殊牌来代替,但是如果你弄丢两张的话就
没有办法了,因为特殊牌上的图案是一样的。
现在你得到了很多扑克牌,准确来说,n种牌你各有a1、a2、……、an张,同时你还有b张特
殊牌,现在你需要从这些牌中整理出若干副牌供大家使用。整理出的一副牌可以由n种普通
牌各一张组成,也可以由n-1种普通牌各一张再加一张特殊牌组成。
请你设计出一种方案,整理出尽可能多的牌。
Input
输入包括2行
第一行给出n和b1
第二行给出a1,a2…an。
1<=n<=1000000牌的数量<=10^6
Output
输出最多能整理出的牌的副数。
Sample Input
5 5
5 5 5 5 5
Sample Output
6

大概思路:模拟一下这个样例
5 4
1 2 3 4 5
我们就能知道,应该尽量将特殊牌分给数量最少的那种牌。
比如上面这个样例
第一轮:用一张特殊牌代替1,然后第2到第五种牌各出一张
第二轮:用一张特殊牌代替1,然后第2到第五种牌各出一张
第三轮:用一张特殊牌代替2,然后第1,第3,第4,第6种牌各出一张
game over!

程序实现环节
发现整个过程,我们需要不断去找最小值,于是想到了heap
进而发现我们如果每次使用一张特殊牌代表某种牌,其它牌各出一张即相当于它们的数字都要减少一个1。这个操作起来是有点麻烦的,要将N-1个数字统统减1,复杂度是N平方的。于是我们设一个变量ans,到目前为止每种牌要减去多少个。
于是对于
1 2 3 4 5
第1轮,最小值为1,给它加上1,得到新数列2 2 3 4 5,ans=1
第2轮,最小值为2,给它加上1,得到新数列2 3 3 4 5,ans=2
第3轮,最小值为2,给它加上1,得到新数列3 3 3 4 5,ans=3
注意此时数列中最小的两个数字均为3,ans也等于3
说明最小的两个数字3,其实真实的值应该是为0的。
于是游戏结束,因为游戏如果再要继续下去的话,则要派出两张特殊牌分别给这两种牌,与题意不合。
最后注意输出结果应该为堆顶元素的值,而不是ans。
这样随便跑一个样例就知道,比如
5 1
5 5 5 5 5
最终结果应该是5,而不是1

#include<queue>
#include<cstdio>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int a[maxn],ans=0;
priority_queue<int,vector<int>,greater<int> >q; int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main(){
int n=read(),b=read();
for(int i=1;i<=n;i++)a[i]=read(),q.push(a[i]);
for(int i=1;i<=b;i++)
{ ans++;
int x=q.top();//出现次数最小的
q.pop();
x++;
q.push(x); //相当于它加了1
int x1=q.top();
q.pop();
int x2=q.top();
q.pop();
q.push(x1);//记得丢回去
q.push(x2);
if(ans==x2&&ans==x1)
break;
}
printf("%d\n",q.top());
return 0;
}

  

最新文章

  1. 总结一下CSS中的定位 Position 属性
  2. Python字符串的encode与decode研究心得乱码问题解决方法
  3. MinGW: TOO MANY SECTIONS issue
  4. html中标签的含义及作用
  5. MapReduce之单词计数
  6. HTML的快速写法:Emmet和Haml
  7. js正则表达式进行格式校验
  8. 一些关于Block, ARC, GCD的总结
  9. poj 3254 状态压缩DP
  10. 系统调用与API的区别
  11. 【POJ2406】 Power Strings (KMP)
  12. Spring注解装配
  13. Unity进阶----AssetBundle_03(2018/11/07)
  14. Mac电脑C语言开发的入门帖
  15. struts2简单入门-执行流程
  16. Java第一个程序之HelloWorld
  17. markdown特殊符号语法
  18. PHP开发——超全局数组变量
  19. Netty+MUI从零打造一个仿微信的高性能聊天项目,兼容iPhone/iPad/安卓
  20. 自然语言交流系统 phxnet团队 创新实训 个人博客 (十四)

热门文章

  1. 2017 ICPC 南宁 L 带权最大递增子序列
  2. 四、Ubuntu16.04下TestLink的部署【测试管理必备工具】
  3. [易学易懂系列|rustlang语言|零基础|快速入门|(4)|借用Borrowing]
  4. jquery 判断是否为空
  5. Groovy assert 断言抛字出来
  6. JAVA笔记14-线程
  7. c# 操作mysql数据库的时候会出现 插入中文汉字变成问号?
  8. shiro框架学习-3- Shiro内置realm
  9. Missing radix parameter.报错解决方法
  10. mysql FIRST()函数 语法