CodeForces

来源:互联网 发布:统计学 算法模型 编辑:程序博客网 时间:2024/06/11 04:28

题目大意:

一个人,在山上,呆了好多天,然后已知他在某几天的高度,问他待在山上的这些天,最高可能到过多高。(注意他相邻两天所在高度差最大为1)。
抽象化:一个函数,告诉你它某几个点的坐标,且该函数图像斜率受到限制,问你该函数最大值为多少。

分析:

就说一句话,就是这些已知高度的日子(n个)把整个旅行过程分成了若干(n+1)段,找出每一段之间可能产生的最高高度。

代码:

#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#define maxm 100500using 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;     }}
0 0