其实这题非常简单。
首先,我们可以明确,遇到充电站后,电量一定是会变成 200 200 200 的,也就是可以继续行驶 200 200 200 单位距离。那么如果行驶了 200 200 200 单位距离后还没有充电站,那么就不可能。
注意一个特殊情况:因为是往返,所以离开最后一个充电站后先到达公路终点,再从公路终点到达最后一个充电站,也就是要走两次,所以这个要特判,如果最后一个充电站离终点超过了 100 100 100 个单位距离,就无法完成。
总结一下:
-
第一步:输入之后从小到大排序。
-
第二步:枚举每个充电站与前面一个的距离,如果超过了 200 200 200 则将变量
flag
设置为false
。 -
第三步,判断最后一个充电站如果最后一个充电站离终点超过了 100 100 100 个单位距离则将变量
flag
设置为false
。 -
第四步,按照
flag
输出,如果flag
为false
输出IMPOSSIBLE
,反之输出POSSIBLE
。 -
注意:
flag
变量初值为true
。
由于题目没有给出 n n n 的取值范围,我们猜测输入中没有重复的充电站位置,所以 n n n 最大应该为 1422 1422 1422,为了保险,我这里开了 1505 1505 1505。
分析完了思路,我们就可以完成代码了:
#include <iostream>
#include <algorithm>
using namespace std;
int a[1505];
int main() {
int n;
while(true) {
cin >> n;
if(n == 0) break;
for(int i = 1;i <= n;i++) cin >> a[i];
sort(a+1,a+n+1);
bool flag = true;
for(int i = 2;i <= n-1;i++) {
if(abs(a[i] - a[i-1]) > 200) {
flag = false;
break;
}
}
if(abs(1422 - a[n]) > 100) flag = false;
if(!flag) cout <<"IMPOSSIBLE" << endl;
else cout << "POSSIBLE" << endl;
}
return 0;
}