首页 > 学院 > 开发设计 > 正文

hdu5248 序列变换 二分

2019-11-06 06:29:19
字体:
来源:转载
供稿:网友

题目链接:

http://acm.hdu.edu.cn/showPRoblem.php?pid=5248

题意:

题解:

二分 从上一个位置到达这个位置,可以通过上一个位置推出当前位置必须到达的最小值now,如果now小于a[i]就无所谓了,因为肯定行,直接更新下一个now;如果now-a[i]大于了当前二分出的伸展极限就不行。

看了别人代码,还是看了很久,还是太菜啊。。

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;#define MS(a) memset(a,0,sizeof(a))#define MP make_pair#define PB push_backconst int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 1e5+10;int n,a[maxn];bool check(int x){ int now=-INF; // 可能x很大,对于a[2]可以到的最小值a[1]-x+1可以变得很负 for(int i=1; i<=n; i++){ if(now-a[i]>x) return false; now = max(now+1,a[i]-x+1); // now表示当前值a[i]可以变到的最小的值+1之后就是a[i+1]的一个必须变到的值,a[i]-x+1也是,取他们的最大值就是a[i+1]必须要到达的最小值 如果a[i+1]>now,就一定可以,更新下一个now的时候,就是a[i+1]-x+1了。 } return true;}int main(){ int T = read(); for(int cas=1; cas<=T; cas++){ n = read(); for(int i=1; i<=n; i++){ a[i] = read(); } int ans = 0; int l = 0, r = 1e6; while(l <= r){ int mid = (l+r)/2; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } cout << "Case #" << cas << ":/n" << ans << endl; } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表