题目大意:

一个人,在山上,呆了好多天,然后已知他在某几天的高度,问他待在山上的这些天,最高可能到过多高。(注意他相邻两天所在高度差最大为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; 
    }
}