您的位置:首页 > 编程语言 > C语言/C++

Codeforces GYM 100738C Rating Shuffle

2016-08-08 23:00 344 查看
传送门:http://codeforces.com/gym/100738/problem/C

ac程序:

//库省略
#define ft first
#define sd second
#define np next_permutation
#define ll long long
#define pb push_back
using namespace std;
ll n,d;
int a[100005];
bool ok;
bool check(ll mid)
{
ll fir=a[1]+d*mid;
for(int i=2;i<=n;i++)
{
ll t=a[i]+d*mid;
if(t<fir)
{
fir=t;
continue;
}
ll times=(t-fir)/d/2+1;
if(times>mid)
{
return false;
}
fir=t-d*times*2;
}
return true;
}
int main()
{
cin>>n>>d;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=a[i-1] && !ok)
ok=true;
}
if(!ok)
{
cout<<0;
return 0;
}
ll l=0,r=1e18;
while(l<=r)
{
ll mid=(l+r)>>1;
if(check(mid))
r=mid-1;
else
l=mid+1;
}
cout<<l;
return 0;
}


思路:

首先这是一道裸裸的二分题,单调性明显,主要问题就是数据范围,在10的18的数据范围里二分查找,其实并不用担心,10的18次方也最多只要60次二分就够了,再加上10的5次方的check,只有6*10的6次方,完全是可以过的。

但是我仍然超时了无数次。

罪魁祸首,始作俑者就是cin

原本以为10的5次方的数据范围不需要scanf,结果就是需要,10的5次方的读入再加上后面那个玩意就会超时,所以,我决定

要不以后就只写scanf吧。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 codeforces