您的位置:首页 > 其它

hihocoder #1095 二分

2016-06-14 20:46 239 查看
注意这里有一个坑点就是上界应该设置为k+1,而不是k。

因为当掷骰子的结果全是k的时候,每次加k也会输。

二分闭区间模板写法:

//这个值越大越能满足,(最小化最大值)
int l = mins, r = maxs;
while (l < r) {
int mid = l + (r - l) / 2;
if (judge(mid)) r = mid;
else l = mid + 1;
}


//这个值越小越能满足,(最大化最小值)
int l = mins, r = maxs;
while (l < r) {
int mid = l + (r - l + 1) / 2;
if (judge(mid)) l = mid;
else r = mid - 1;
}


double l = mins, r = maxs + 1;
for (int i = 0; i < 150; i++) {
double mid = (l + r) / 2;
// .....
}


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <stack>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
#define pr(x) cout << #x << ": " << x << "  "
#define pl(x) cout << #x << ": " << x << endl;
#define pri(a) printf("%d\n",(a))
#define xx first
#define yy second
#define sa(n) scanf("%d", &(n))
#define sal(n) scanf("%lld", &(n))
#define sai(n) scanf("%I64d", &(n))
#define vep(c) for(decltype((c).begin() ) it = (c).begin(); it != (c).end(); it++)
const int mod = int(1e9) + 7, INF = 0x3f3f3f3f;
const int maxn = 1e5 + 13;
int A[maxn], n, k;

bool judge(int mid) {
ll hi = 0, ho = 0, v = 0;
for (int i = 0; i < n; i++) {
v += mid;
if (A[i] >= v) {
hi++;
v = 0;
} else {
ho++;
v -= A[i];
}
}
return ho > hi;
}

int main(void)
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif
sa(n), sa(k);
for (int i = 0; i < n; i++) {
sa(A[i]);
}
int l = 1, r = k + 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (judge(mid)) r = mid;
else l = mid + 1;
}
pri(l);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: