11093 - Just Finish it up

从1开始枚举起点,如果起点大于n了仍未找到答案,则确定无解。 r枚举终点,如果可以循环一圈回到起点,则输出l,否则,在某个r点汽油将小于0,那么从l到r的所有点都不可能是解,因为那样汽油量将更小,更无法完成r点到下一点的任务 。 如此这般就行了,需要注意的是如果r<l 时汽油<0了,那么必然无解。

#include<bits/stdc++.h>
using namespace std;
int T,n,p[100005],q[100005],kase=0;
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&p[i]);
        for(int i=1;i<=n;i++) scanf("%d",&q[i]);
        int l=1,r=1;
        bool ok = false;
        printf("Case %d: ",++kase);
        while(l<=n) {
            int ans = 0;
            bool flage = true;
            while(r!=l||flage){
                flage = false;
                ans+=p[r];
                ans-=q[r];
                if(ans<0) {
                    if(l>r) goto loop;
                    l = r+1; r = r+1; break;
                }
                else r++;
                if(r>n) r = 1;
                if(l==r) ok = true;
            }
            if(ok) { printf("Possible from station %d\n",l); break; }
        } loop:
         if(!ok) printf("Not possible\n");
    }
    return 0;
}
时间: 05-16

11093 - Just Finish it up的相关文章

UVA 11093 Just Finish it up

题意:一个环形跑道,每到一个站可以获得汽油,每到下一个站消耗一定的汽油,问标号最小的使得能够完成一次环形的起点站. 题解:如果朴素的枚举起点,复杂度达到O(N*N*T)超时.所以考虑是否当前所肯定或者否定的起点给可以对下一次进行排除或化简,或者也可能是具有特殊性质,不需要进行一次完整的遍历计算,也就是分别从第一个T和第二个T两个角度去考虑.发现如果当前起点不可行,那么起点到最远可以到达的点之间所有的点都不可以作为起点.完成优化. //debug:值得注意的就是环状的怎么写 代码: #includ

UVA - 11093 Just Finish it up(环形跑道)(模拟)

题意:环形跑道上有n(n <= 100000)个加油站,编号为1~n.第i个加油站可以加油pi加仑.从加油站i开到下一站需要qi加仑汽油.你可以选择一个加油站作为起点,起始油箱为空(但可以立即加油).你的任务是选择一个起点,使得可以走完一圈后回到起点.假定油箱中的油量没有上限.如果无解,输出Not possible,否则输出可以作为起点的最小加油站编号. 分析:如果从加油站st开始,一直到加油站id油没了,说明id之前的加油站都不可以作为起点.枚举并验证所有起点即可. #pragma comme

UVA 11093 Just Finish it up 环形跑道

有一个环形跑道,上面有n个加油站,到i号加油站可以加pi的油,跑到下一站要花费qi的油,起点任意选,问是否有一个起点可跑完整个跑道. 从i开始跑,如果遇到某个站j不能跑了,那么从i到j之间的站开始跑,到j的油不会增加,所以下次直接从j+1开始跑.复杂度是O(n) #include<bits/stdc++.h> using namespace std; #define bug(x) cout<<#x<<'='<<x<<endl; const int

【uva 11093】Just Finish it up(算法效率+贪心)

题意:环形跑道上有N个加油站,编号为1~N.第 i 个加油站可以加油Ai加仑,从加油站 i 开到下一站需要Bi加仑汽油.问可作为起点走完一圈后回到起点的最小加油站编号. 解法:我们把每个加油站的Ai,Bi合并,把Ai-Bi看成N个点的权Ci,表示经过 i 的剩余油量.可知可通过第 i 个加油站就是sum{}+Ci>=0,sum{}表示从起点开到 i 之前剩余的油量,sum{}>=0.因此,若sum{}+Ci<0,那么从这时枚举的起点到 i 之间的所有点都不能作为起点,因为这时的sum{}

【例题 8-13 UVA - 11093】Just Finish it up

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法. 假设现在取[l..r]这一段. 然后发现累加的和小于0了. 那么方法只能是不走l..l+1这一段了 即delta递减(p[l]-q[l]); 直到delta>=0为止. 某个时刻如果发现r+1==l 或者l==1且r==n 则合法. 如果发现l大于n了.则返回无解 [代码] #include <bits/stdc++.h> #define ll long long using namespace std; co

android finish和system.exit(0)的区别

finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理:当调用System.exit(0)时,杀死了整个进程, 这时候活动所占的资源也会被释放. 在开发android应用时,常常通过按返回键(即keyCode == KeyEvent.KEYCODE_BACK)就能关闭程序,其实大多情况下该应用还在任务里运行着,其实这不是我们想要的结果. 我们可以这样做,当用户点击自定义的退出按钮或返回键时(需要捕获动

android 在finish()的时候不是立刻调用onDestory,怎样才能在finish后立刻回调onDestory?

============问题描述============ private MyAIDLService myAIDLService; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentN

在eclipse创建android project,最后一步点击finish没反应

在创建android project的时候,到最后一步点击finish没有反应. 本来以为可能是SDK中的Extra下Android Support Library没有安装,后来检查发现Minimum Required SDK中选择的版本过低导致 ,选择其他版本之后就能正常使用了 图中为最开始选择的版本(小小的教训) 新手上路,大神勿喷,自己的一点小经验,希望能对新手有些小帮助

System.exit(0);和finish();,push原理

今天师姐问我安卓后台的问题,想起几年前做进制转换的时候特意研究了一下怎么才能「不驻留内存地退出」.虽然Android不推荐用户手动关闭进程,但是在那个内存捉襟见肘的年代,不得不考虑内存. 首先直接按back键肯定是会驻留内存的,其次finish()也可以结束Activity,但是也驻留内存(我还清楚地记得当时做过实验,业界良心没有没).试了很多方法,最后找到一种方法可以退出: 在底层的Activity上添加back键监听,然后在onClick()里面用这个方法: System.exit(0);