贪心·UVA-11093·环形跑道

题目大意:

n个加油站,编号1~n,第i个加油站可以加油pi加仑,开到下一站需要qi加仑,问是否可以选择一个编号尽量小的加油站为起点跑完所有一圈。

解题思路:

如果1234,到4不能走下去了,那么1234均不可能作为起点,以此为依据,遍历一边即可。

但是在最后不能将结果ans%n,如果ans是n的话,就会是0,因此应该是ans>n时,ans -= n;

AC代码:

#include<bits/stdc++.h>
#include <iostream>
#include <cstring>
#include <cmath>
#include <set>
#include <cstdio>

using namespace std;
typedef long long ll;
//#define ms(a,b) memset(a,b,sizeof(a))
//const int mod = 10056;
//const int maxn = 40;
//#define eps 1e-6
//int dp[maxn];
//char c[1010][1010];
int f[2010000];
int s[201000];
//int sum[101000];

//int cmp(int a, int b, int c, int d) {
//    return (sum[a] - sum[b]) * (c - d) - (sum[c] - sum[d]) * (a-b);
//}

//ll c(int k) {
//    if (k == 0){
//        return 1;
//    }
//    else{
//        return c(k-1) * 3;
//    }
//}

//ll g(int k, ll l) {
//    //cout << k <<" "<< l << endl;
//    if (l == 0) {
//        return 0;
//    }
//    if(k == 0) {
//        return 1;
//    }

//    if(l >= (1<<(k-1))) return 2*g(k - 1, l - (1<<(k-1)) ) + c(k-1);
//    else{
//        return g(k - 1, l);
//    }
//}

int main() {
    //int a, b, k;
    int t;
    int n;
    cin >> t;
    int kase = 0;
    while(t --) {
        kase ++;
        cin >> n;
        int sum = 0;
        int ans = 1;
        int pos = 1;
        for (int i = 1; i <= n; i++) {
            cin >> f[i];
            f[n+i] = f[i];
        }
        for (int i = 1; i <= n; i++) {
            cin >> s[i];
            s[n+i] = s[i];
        }
        int flag = 0;
        int flag1 = 0;
        int num = 0;
        for (int i = 1; i <= 2*n; i++) {
            //cout <<i << " " <<  flag << " "<< ans << " "<< sum <<" "<<sum+f[i]<<" "<< s[i]<< endl;
            if (ans > n) {
                break;
            }
            else if (i - ans >= n-1 && num >= n) {
                //cout <<"num:" <<num<<endl;
                flag = 1;
                break;
            }
            else if (sum + f[i] < s[i]) {
               // cout<<sum + f[i] << " "<<s[i]<<"---"<<endl;
                ans = i+1;
                sum = 0;
                //flag1 = 0;
                num = 0;
            }
            else {
                num++;
                //flag1 = 1;
                //ans = i;
                //cout <<"+++ " << endl;
                sum = sum + f[i] - s[i];
            }

        }
        //cout << flag << endl;
        cout << "Case " << kase << ": " ;
        if(!flag) {
            cout << "Not possible" << endl;
        }
        else {
            if(ans > n) {
                ans -= n;
            }
            cout << "Possible from station " << ans<< endl;
        }
    }
}




//s














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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值