poker
一副扑克牌有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;
}
poker的更多相关文章
- uva131 The Psychic Poker Player
The Psychic Poker Player Time Limit: 3000MS 64bit IO Format: %lld & %llu Description In 5-ca ...
- UVa12298 Super Poker II(母函数 + FFT)
题目 Source http://acm.hust.edu.cn/vjudge/problem/23590 Description I have a set of super poker cards, ...
- HDU 4759 Poker Shuffle
Poker Shuffle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)C. Bear and Poker
C. Bear and Poker ...
- ZOJ 1111 Poker Hands
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1111 A poker hand consists of 5 ca ...
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) A. Bear and Poker 分解
A. Bear and Poker Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/573/pro ...
- ZOJ1111:Poker Hands(模拟题)
A poker deck contains 52 cards - each card has a suit which is one of clubs, diamonds, hearts, or sp ...
- 如何生成一副Poker
import java.util.LinkedList;import java.util.Random;//扑克类class Poker{ String color;//花色 String ...
- bzoj2487: Super Poker II
Description I have a set of super poker cards, consisting of an infinite number of cards. For each p ...
- One Card Poker
qsc oj 题目 提交 比赛 小组 排名 帮助 Mactavish 题目 我的提交 One Card Poker 发布时间: 2017年2月14日 14:02 最后更新: 2017年2月14日 ...
随机推荐
- [TJOI2013]松鼠聚会(枚举)
[TJOI2013]松鼠聚会 题目描述 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x, ...
- uboot dcc
arch\arm\lib crt0.S 1.设置sp为CONFIG_SYS_INIT_SP_ADDR include/configs/xxx.h #define CONFIG_SYS_INIT_SP_ ...
- Flume 实时获取日志内容插入MySQL
https://www.jianshu.com/p/22e6133649ca 采用链接的方法试了一下,好像不成功,问题出在 channel.take(); //获取出来的Event为空,不知道为啥
- 跨平台开发框架DevExtreme v19.1.4正式发布|附下载
DevExtreme Complete Subscription是性能最优的 HTML5,CSS 和 JavaScript 移动.Web开发框架,可以直接在Visual Studio集成开发环境,构建 ...
- Redhat 关闭防火墙和selinux
查看防火墙状态.systemctl status firewalld 临时关闭防火墙命令.重启电脑后,防火墙自动起来.systemctl stop firewalld 永久关闭防火墙命令.重启后,防火 ...
- 机器学习降维--lu分解
- Git远程新建分支之后,本地看不到最新分支
git remote update origin –prune 注意 双- csdn 对于 两个 - 看起来像一个
- javascript基本知识图解
转载自 网络博客 变量 数据类型 javascript运算符 javascript流程语句 javascript 数组 javascript window对象 javascript DOM javas ...
- CSP-S2019游记&拆塔记
不是拆广州塔 Day -inf 四套NOI模拟降智 Day0 拆了一发新新 本来想复习小圆脸结果拆了3h最后还没带任意门 没有帘子可还行 第一天由于没发现被子可以抽出来就没睡好 Day1 8:30开考 ...
- SpringCloud 入门知识篇
SpringCloud 入门 springcloud 学习 7天学会springcloud 教程 https://www.cnblogs.com/skyblog/category/738524.htm ...