1816: [Cqoi2010]扑克牌

来源:互联网 发布:mobi格式转换软件 编辑:程序博客网 时间:2024/05/22 05:33
Description


你有n种牌,第i种牌的数目为ci。另外有一种特殊的牌:joker,它的数目是m。你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1套牌。比如,当n=3时,一共有4种合法的套牌:{1,2,3}, {J,2,3}, {1,J,3}, {1,2,J}。 给出n, m和ci,你的任务是组成尽量多的套牌。每张牌最多只能用在一副套牌里(可以有牌不使用)。
Input


第一行包含两个整数n, m,即牌的种数和joker的个数。第二行包含n个整数ci,即每种牌的张数。
Output


输出仅一个整数,即最多组成的套牌数目。
Sample Input


3 4


1 2 3
Sample Output


3

二分答案。

#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;const int maxm = 1000005;int n, m, a[maxm];int find(int k);int main(){int i, j, k, sum, ans;scanf("%d%d", &n, &m);for (i = 1;i <= n;i++)scanf("%d", &a[i]);sort(a + 1, a + 1 + n);int l = 0, r = 1000000001;while (r - l > 1){int mid = (r + l) / 2;if (find(mid)) { l = mid, ans = mid; }else r = mid;}printf("%d\n", ans);return 0;}int find(int k){int x = min(k, m);for (int i = 1;i <= n;i++){if (a[i] < k) x -= (k - a[i]);if (x < 0) return 0;}return 1;}


原创粉丝点击