1.题目描述:点击打开链接
2.解题思路:本题利用代数分析来解决。由于要找一个最高的海拔,考虑到它受到变化量不超过1的约束,因此可以通过列方程解得连续两个输入之间的最高海拔。假设第一个输入是d1,h1,第二个输入是d2,h2.设d1,d2之间第k天海拔最高,最高的海拔为h。不难得到如下两式:
h-h1=k-d1;
h-h2=d2-k;
可以解得h=(d2-d1+h1+h2)/2。设最终答案为ans,那么逐次更新最大值即可。注意,不要忘记了第一天到第一个输入的天数之间的最大值以及最后一个输入和最后一天的最大值。
3.代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;
typedef long long ll;
#define N 100000+5
struct Node
{
int day, h;
void read()
{
cin >> day >> h;
}
}q[N];
int n, m;
int main()
{
//freopen("t.txt", "r", stdin);
while (~scanf("%d%d", &n, &m))
{
memset(q, 0, sizeof(q));
for (int i = 0; i < m; i++)
q[i].read();
int maxd = q[0].day - 1 + q[0].h;//第一天到第一个输入的最大值
for (int i = 0; i < m - 1; i++)
{
int j = i + 1;
if (abs(q[j].h - q[i].h) <= q[j].day - q[i].day)
maxd = max(maxd, (q[j].day - q[i].day + q[i].h + q[j].h) / 2);
else { puts("IMPOSSIBLE"); goto x1; }
}
maxd = max(maxd, n - q[m - 1].day + q[m - 1].h);//最后一个输入到最后一天的最大值
printf("%d\n", maxd);
x1:;
}
return 0;
}