题目大意:
一个人,在山上,呆了好多天,然后已知他在某几天的高度,问他待在山上的这些天,最高可能到过多高。(注意他相邻两天所在高度差最大为1)。
抽象化:一个函数,告诉你它某几个点的坐标,且该函数图像斜率受到限制,问你该函数最大值为多少。
分析:
就说一句话,就是这些已知高度的日子(n个)把整个旅行过程分成了若干(n+1)段,找出每一段之间可能产生的最高高度。
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define maxm 100500
using namespace std;
int m,n;
int a[maxm];
int h[maxm];
int main()
{
int flag=0;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a[i],&h[i]);
}
int max=h[1]+a[1]-1;
if(max<(n-a[m]+h[m]))max=n-a[m]+h[m];
for(int i=1;i<m;i++)
{
int s=h[i+1]-h[i];
if(s<0)s=-s;
if(s>a[i+1]-a[i])
{
flag=1;break;
}
int k=h[i+1];
if(k<h[i])k=h[i];
int t=(a[i+1]-a[i]-s)/2+k;
if(max<t)max=t;
}
if(flag==1)
{
cout<<"IMPOSSIBLE";
}
else
{
cout<<max;
}
}