Bailian3470 整理扑克牌贪心+二分

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bailian3470 整理扑克牌贪心+二分相关的知识,希望对你有一定的参考价值。

3470:整理扑克牌

总时间限制: 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 整理扑克牌贪心+二分的主要内容,如果未能解决你的问题,请参考以下文章

NOIP2015斗地主[DFS 贪心]

bzoj1816: [Cqoi2010]扑克牌

贪心 - bailian4137:最小新整数

扑克牌顺子

扑克牌顺子

扑克牌顺子