题目链接
解题方法:贪心
题目分析
题目大意
有n个加油站,按照顺时针形成一个闭合的环,提供每一个加油站i可加的油量ai,以及从加油站i到加油站i+1的耗油量bi,问:是否能从这n个站中的一个站出发,能走完这个圈,如果可以,输出起点,否则输出不行。
解析
做这道题首先要搞清楚这么一个情况,假设环路上有i,j,k三个加油站,并且i<j<k(顺时针方向)。如果:有车从i出发(在i的时候,车本来是没有油的,但是加了a[i]的油,然后出发),可以到达k-1,但是到达不了k。那么:该车从j出发,也到达不了k。从i出发能到达k-1,也就表示,从i出发能到达j,到j点时最坏的情况是油刚好耗尽,这就相当于从j出发了,否则,到j的时候油是有一定剩余的,仍然到不了k,那么不剩余的话,更到不了k了。
明白了上面这个情况,就好做多了,输入的时候直接输入进去两个圈,放在一个数组里(转了一个圈之后直接往下一个下标扫就好了)。设置l、r,l作为起点,r作为终点,如果从l出发恰好到不了r,那么就直接把r设置为新的起点,一直这么扫,如果l在前n个下标(即转了一圈之内)都没有找到结果,那么必然impossible了。
那么如何判断l到不了r呢?可以这样操作,从l出发,用一个变量(代码中的num)记录到某一站剩余的油量,每次到一站加一下a[i]-b[i],如果num出现负数,即油不够了,那必然到不了这一站了。
其他
本题采用的方法,是找到答案即停止。按照个人习惯,一般是设置一个标签label,一旦找到答案就goto label
,这是实际上是不太好的,即使写起来方便。但是goto语句太老了(各种c语言入门书里都这么说),另外会造成结构混乱、可读性差等缺点。所以这次也学习了一下别人的姿势,建立一个记录答案的变量,找到答案就停,利用if、break语句,让代码看起来更优美一些。
参考题解
http://blog.csdn.net/u014569598/article/details/38870013
代码
1 |
|