描述
题解
一开始看到这道题,感觉挺简单的,但是,我只关注了明沟,却忽略了暗坑!!!
首先,这里我们将这些特殊点成为卡点,但是不是所有的卡点都能卡住数据的,其中,最容易想到的是t < x - 1
的点是无法卡住数据的,所以我们可以直接忽略掉,那么剩下的卡点一定是可以卡住数据的,但是这时候筛选出来的卡点其中有两种情况并无法精准的卡住数据,即:
T[i] > T[i - 1] + X[i] - X[i - 1]
T[i] > T[i + 1] + X[i + 1] - X[i]
所以我们需要对这两种情况进行精度校正,这时,需要强调的是,当第二种情况出现时,我们有可能需要对前边已经校正过精度的点重新校正一下,因为第i
个如果因为第i + 1
个而改变,那么第i - 1
个就存在因为第i
个而改变的可能。
代码
#include <iostream>
using namespace std;
const int MAXM = 55;
int X[MAXM];
int T[MAXM];
int main(int argc, const char * argv[])
{
// freopen("/Users/zyj/Desktop/input.txt", "r", stdin);
int P;
cin >> P;
int N, M;
int x, t;
while (P--)
{
cin >> N >> M;
int key = 0;
for (int i = 0; i < M; i++)
{
cin >> x >> t;
if (t < x - 1) // 会卡住数据上限的转存
{
X[key] = x;
T[key++] = t;
}
}
// 如理特殊卡点 ex: (3)*(0) (3)无法取3
for (int i = 0; i < key; i++)
{
if (T[i] > T[i - 1] + X[i] - X[i - 1] && i != 0)
{
T[i] = T[i - 1] + X[i] - X[i - 1];
}
if (T[i] > T[i + 1] + X[i + 1] - X[i] && i != key - 1)
{
T[i] = T[i + 1] + X[ i + 1] - X[i];
if (i >= 2)
{
i -= 2;
}
}
}
if (!key)
{
cout << N - 1 << '\n';
continue;
}
int ans = T[0] > (X[0] + T[0] - 1) / 2 ? T[0] : (X[0] + T[0] - 1) / 2;
for (int i = 1; i < key - 1; i++)
{
if ((T[i] + T[i + 1] + X[i + 1] - X[i]) / 2 > ans)
{
ans = (T[i] + T[i + 1] + X[i + 1] - X[i]) / 2;
}
}
ans = T[key - 1] + N - X[key - 1] > ans ? T[key - 1] + N - X[key - 1] : ans;
cout << ans << '\n';
}
return 0;
}