例题8-13 UVA 11093 Just Finish it up 环形跑道

大体题意不说了,书上说的很清楚!

思路:

1.首先先从1开始模拟检测,当发现i = p时,sum  < 0 时说明,1 到P都不行!就让i 从p+1开始继续找

直到发现结束位置比开始位置小的时候,那就说明无解应该输出-1.

因为一旦出现结束位置比开始位置小,说明1到 开始位置都不可以,开始位置到结束位置都不可以,而这两个的并集就是全集,所以1到n没有合适的位置!

否则就输出那个开始位置!


代码如下:


#include<cstdio>
const int maxn = 100000 + 10;
int p[maxn],q[maxn],n,flags,flage,ok;
bool go(int s){
    flags=s;
    int sum = 0;
    for (int i = 0; i < n; ++i){
        int key = (s+i)%n;
        sum+=p[key]-q[key];
        if (sum < 0){flage=key;return false;}
    }
    return ok=true;
}
int main()
{
    int T,cnt=0;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for (int i = 0; i < n; ++i)scanf("%d",&p[i]);
        for (int i = 0; i < n; ++i)scanf("%d",&q[i]);
        ok = false;
        for (int i = 0; i < n; ++i){
            if(!go(i)){
                if (flags > flage)break;
                i=flage;
                continue;
            }break;
        }
        printf("Case %d: ",++cnt);
        if (ok)printf("Possible from station %d\n",flags+1);
        else printf("Not possible\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值