View Code of Problem 6

#include<iostream>

using namespace std;

//这题其实有点小错误,按照它的意思,每个陷阱是连在一起的,即当前陷阱的结尾是下一个陷阱的开头。

int main() {
	int t, n;
	cin >> t;
	while (t--)
	{
		cin >> n;
		int **arr = new int*[n];
		int minstep = -1;//因为必须跨过所有陷阱,故先求得能跨过所有陷阱的最小步长
		for (int i = 0; i < n; i++)
		{
			arr[i] = new int[2];
			cin >> arr[i][0] >> arr[i][1];
			if (arr[i][1]-arr[i][0] > minstep)
				minstep = arr[i][1] - arr[i][0];
		}
		bool judge = true;
		for (int i = 0; i < n-1; i++)//按照最小步长一步一步跳(因为minstep为能跨过所有陷阱的最小步长,故不会出现因步长不够落入陷阱的情况)
		{
			if (arr[i][0]+minstep>arr[i+1][0])//一但超过当前所跨越的陷阱长度,返回失败(要么落入陷阱,要么跨越多个陷阱)
			{
				judge = false;
				break;
			}
		}
		if (judge)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	return 0;
}

Double click to view unformatted code.


Back to problem 6