题意:
环形跑道上有n个加油站,编号为1-n。第i个加油站可以加油pi加仑。从加油站i开到下一站需要qi加仑汽油。你可以选择一个加油站作为起点,初始油箱为空,但是可以立即加油。你的任务是选择一个起点,使得可以走完一圈后回到起点,假定油箱中的油量没有上线。如果无解,输出 Not possible,否则输出可以作为起点的最小加油站的编号
分析:
贪心。
试想 如果从你可以从1走到p 但是从1 - p + 1就不能走了,那问题在于p - p + 1一定是一个减油的过程
如果可以从 1-2 不能从 1-3 代表 1-2是加油的过程(至少不需要别人的油
这样一想 1-p 一定是赚油的 但是 1-p - 1是可以走的, 说明 p - 1 -> p 的供油量(或者说剩余量)不足以让 p -> p + 1
这样一直推上去,就知道从 1-p 为加油站的起始点,是不可能的,一定也会缺油
因为前面既然能走,一定是省油的。
好,有了这个想法的话,就可以在O(n)的时间解决问题。
代码:
#include<bits/stdc++.h>
#define LL long long
#define ms(s) memset(s, 0, sizeof(s))
using namespace std;
const int maxn = 1e5 + 10;
int p[maxn]; // 加油
int q[maxn]; //