码迷,mamicode.com
首页 > 其他好文 > 详细

[BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】

时间:2015-01-26 16:55:12      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:BZOJ - 1816

 

题目分析

答案具有可以二分的性质,所以可以二分答案。

验证一个答案 x 是否可行,就累加一下各种牌相对于 x 还缺少的量,如果总和超过了 x 或 m ,就不可行。

因为,当使用的joker小于等于 x 时,才可以通过合适地安排顺序使得每组牌中至多有一张 joker 。

 

代码

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

const int MaxN = 50 + 5;

int n, m, MaxA, Ans;
int A[MaxN];

bool Check(int x) {
	int t = min(x, m);
	for (int i = 1; i <= n; ++i) {
		if (A[i] < x) {
			t -= x - A[i];
			if (t < 0) return false;
		}
	}
	return true;
}

int main() 
{
	scanf("%d%d", &n, &m);
	MaxA = -1;
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &A[i]);
		MaxA = max(MaxA, A[i]);
	}
	Ans = 0;
	int l, r, mid;
	l = 0; r = MaxA + m; 
	while (l <= r) {
		mid = (l + r) >> 1;
		if (Check(mid)) {
			Ans = mid;
			l = mid + 1;
		}
		else r = mid - 1;
	}
	printf("%d\n", Ans);
	return 0;
}

  

[BZOJ 1816] [Cqoi2010] 扑克牌 【二分答案】

标签:

原文地址:http://www.cnblogs.com/JoeFan/p/4250524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!