• ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 80 Days(尺取)题解


    题意:n个城市,初始能量c,进入i城市获得a[i]能量,可能负数,去i+1个城市失去b[i]能量,问你能不能完整走一圈。

    思路:也就是走的路上能量不能小于0,尺取维护l,r指针,l代表出发点,r代表当前走到的点,维护一个sum。和工程的题一模一样啊。

    代码:

    #include<set>
    #include<map>
    #include<stack>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    typedef long long ll;
    const int maxn = 1e6 + 10;
    const int seed = 131;
    const ll MOD = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    ll a[maxn << 1], b[maxn << 1];
    int main(){
        int T;
        scanf("%d", &T);
        ll n, c;
        while(T--){
            scanf("%lld%lld", &n, &c);
            for(int i = 1; i <= n; i++){
                scanf("%lld", &a[i]);
                a[i + n] = a[i];
            }
            for(int i = 1; i <= n; i++){
                scanf("%lld", &b[i]);
                b[i + n] = b[i];
            }
    
            int l = 1, r = 1, ans = -1;
            ll sum = c;
            while(l <= n){
                sum += a[r];
                while(sum < 0 && l < r){
                    sum = sum - a[l] + b[l];
                    l++;
                }
                sum -= b[r];
                r++;
                while(sum < 0 && l < r){
                    sum = sum - a[l] + b[l];
                    l++;
                }
                if(r == l + n){
                    ans = l;
                    break;
                }
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    /*
    2
    3 0
    3 4 5
    5 4 3
    3 100
    -3 -4 -5
    30 40 50
    */
  • 相关阅读:
    置换加密算法
    堆和优先队列的应用
    定时发送邮件小程序
    Hibernate的缓存
    Spring中使用JDBC
    Spring AOP(创建切面)
    处理不可中断阻塞
    SQL语句实例说明
    spring_声明式事务
    Flex_includeIn属性的作用
  • 原文地址:https://www.cnblogs.com/KirinSB/p/9693959.html
Copyright © 2020-2023  润新知