Ссылка:
https://vjudge.net/problem/HDU-6669
Значение вопросов:
Медведи степень играть удовольствие от игры.
Герой игры ряд осью вращения, то он может перейти на номер строки, для каждого движения, он может пойти вправо или влево , чтобы выбрать одну ячейку или две ячейки.
Теперь он должен для завершения п задач, для задачи я, пока он находится в интервале [аи би] на, даже если завершение задачи.
Степень Медведь хотела бы знать, для того , чтобы завершить все задачи, по крайней мере , вам нужно переместить много раз?
Степень, несет в себе исходное положение может быть выбрано произвольно.
Идеи:
На первом взгляде это жадная, нажмите у взяла последовательность, сумасшедший в, чтобы найти решение проблемы находится в соответствии с порядком .....
поддерживать текущий диапазон находится, а затем найти из недавнего запуска вокруг на линии.
Код:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e3+10;
struct Node
{
int x, y;
}node[MAXN];
int n;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--)
{
cin >> n;
for (int i = 1;i <= n;i++)
cin >> node[i].x >> node[i].y;
int res = 0;
int l = node[1].x, r = node[1].y;
for (int i = 2;i <= n;i++)
{
if (node[i].x >= l && node[i].y <= r)
l = node[i].x, r = node[i].y;
else if (node[i].x >= l && node[i].x <= r && node[i].y > r)
l = node[i].x;
else if (node[i].x < l && node[i].y >= l && node[i].y <= r)
r = node[i].y;
else if (node[i].x > r)
{
res += (node[i].x-r+1)/2;
l = node[i].x, r += ((node[i].x-r+1)/2)*2;
r = min(r, node[i].y);
}
else if (node[i].y < l)
{
res += (l-node[i].y+1)/2;
r = node[i].y, l -= ((l-node[i].y+1)/2)*2;
l = max(l, node[i].x);
}
}
cout << res << endl;
}
return 0;
}