您的位置:首页 > 其它

noip 2015 day2 t1 跳石头 二分

2015-11-26 19:43 239 查看



没办法,弱小的我就从水题开始吧!

今年noip2015 day2 的 t1 是比较常见的求最小值最大的题,这一些在训练指南第一章中曾多次出现, 其中lrj曾说“解决“最小值最大”的常用方法是二分答案”。所以在比赛的时候弱小的我唯一想到的也就是二分了。

接着便是核心便是对于判断函数的处理。

我当时采取的策略是从左往右扫,然后只删右边,不删左边,因为是从左往右扫,所以左边的石子一定能满足条件。

这样,这道题就出来了,最后说一句细心很重要,因为没有考虑最后一颗石子到终点的距离而失分。

就这样吧!第一次写博客,感觉不错。

#include<cstdio>
#include<iostream>
#include<cstring>
#define rep(i,j,k) for(int i = j; i <= k; i++)
using namespace std;
int a[50001] = {0};
int num[50001] = {0};
int n, m, k;

int read()
{
int s = 0;
char c = getchar();
while( !isdigit(c) ) c = getchar();
while( isdigit(c) ){
s = s * 10 + c - '0';
c = getchar();
}
return s;
}

bool chu(int x)
{
memcpy(num,a,sizeof(a));
int tot = 0;
rep(j,1,m){
if( num[j] - num[j-1] < x ) {
num[j] -= (num[j]-num[j-1]);
tot++;
}
if( tot > k ) return 0;
}
return 1;
}

int main()
{
n = read(), m = read(), k = read();
int l = 0, r = 0xfffffff;
rep(i,1,m+1){
if( i == m+1 ) a[i] = n;
else a[i] = read();
if( i > k) r = min(r,a[i]-a[i-k-1]);
}
while( l < r ){
int mid = l + (r-l) / 2;
if( l == r - 1 ) mid++;
if( chu(mid) ) l = mid;
else r = mid-1;
}
cout<<l<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: