您的位置:首页 > 其它

HDU 5248 序列变换 —— 二分

2015-06-02 00:34 330 查看
#include <stdio.h>
#include <iostream>
using namespace std;

int a[100005], c[100005];

int mmin(int a, int b) {
return a > b ? b : a;
}

int mmax(int a, int b) {
return a > b ? a : b;
}

bool check(int value, int n) {
c[0] = a[0] - value;
for (int i = 1; i < n; ++i) {
if (c[i - 1] >= a[i]) {
c[i] = mmin(c[i - 1] + 1, a[i] + value);
} else {
c[i] = mmax(c[i - 1] + 1, a[i] - value);
}
if (c[i] <= c[i - 1]) {
return false;
}
}
return true;
}

int dowork() {
int n;
scanf ("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
int min = 0, max = 2000000;
while (min < max) {
int mid = (min + max) / 2;
if (check(mid, n)) {
max = mid;
} else {
min = mid + 1;
}
}
return min;
}

int main() {
int cas;
scanf("%d", &cas);
for (int i = 1; i <= cas; ++i) {
printf("Case #%d:\n%d\n", i, dowork());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息