Bailian3470 整理扑克牌贪心+二分
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bailian3470 整理扑克牌贪心+二分相关的知识,希望对你有一定的参考价值。
总时间限制: 1000ms 内存限制: 65536kB
描述
一副扑克牌有4种花色的牌各13张,再加上大小王2张,总共有54张牌。一般你买的一副新扑克牌里除了这54张牌外还会有一两张特殊的牌,如果你不小心弄丢了54张牌中的某一张,就可以用特殊牌来代替,但是如果你弄丢两张的话就没有办法了,因为特殊牌上的图案是一样的。
现在你得到了很多扑克牌,准确来说,54种牌你各有a1、a2、……、a53、a54张,同时你还有b张特殊牌,现在你需要从这些牌中整理出若干副牌供大家使用。整理出的一副牌可以由54种普通牌各一张组成,也可以由53种普通牌各一张再加一张特殊牌组成。
请你设计出一种方案,整理出尽可能多的牌。
输入
输入包含多组数据,每组数据包含55个整数(不超过1000000),第一个数是b即特殊牌的数目,接下来分别是a1、a2、……、a53、a54。
输出
输出最多能整理出的牌的副数。
样例输入
11
5 4 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10
10 10 10 10
54
54 54 54 54 54 54 54 54 54 54
54 54 54 54 54 54 54 54 54 54
54 54 54 54 54 54 54 54 54 54
54 54 54 54 54 54 54 54 54 54
54 54 54 54 54 54 54 54 54 54
54 54 54 54
样例输出
9
55
问题链接:Bailian3470 整理扑克牌
问题简述:(略)
问题分析:用贪心法+二分法来解决,不解释。
程序说明:(略)
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* Bailian3470 整理扑克牌 */
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int G = 1000000000;
const int N = 54;
int b, a[N];
int judge(int m)
int sum = 0;
for (int i = 0; i < N; i++)
if (a[i] < sum) return 0;
if ((sum += max(m - a[i], 0)) > b) return 0;
return 1;
int main()
while (~scanf("%d", &b))
for (int i = 0; i < N; i++)
scanf("%d", &a[i]);
sort(a, a + N);
// 二分法
int l = 0, r = G;
while (r - l > 1)
int mid = (l + r) / 2;
if (judge(mid)) l = mid;
else r = mid;
printf("%d\\n", l);
return 0;
以上是关于Bailian3470 整理扑克牌贪心+二分的主要内容,如果未能解决你的问题,请参考以下文章