[尺取法]2017 ACM/ICPC Asia Regional Shenyang Online 1012

更正一下,原来的代码用的结构体,比赛时内存卡过去了,现在改成数组,时间内存都减少了。谢谢!@小白c
比赛时的提交:
比赛是的提交
修正后:
修正后


题目:
这里写图片描述
这里写图片描述

题意&分析:
题目的意思大概就是对于 n 堆卡牌,每堆 ai 张,对应的取了这堆的所有牌到手上之后要翻牌子(臣妾做不到),翻 bi 张,当手上的牌不够翻的时候,游戏结束,拿走在手上的所有牌(不管翻没翻),游戏开始前可以将最前面一堆移到最后面(次数不限),求可以拿走牌的最大值。

设已经那的牌的个数是maxa,要翻的牌总数是maxb,
等价转换成
1. maxa>=maxb,那么就可以继续取;
2. maxa < maxb,游戏结束;

用尺取法,对于要移动堆这件事,可以输入数据的时候就在后面复制一边(e.g. 1234512345)。

尺取法介绍: 一号传送门 二号传送门

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <cctype>
#include <fstream>
#define INF 0x3f3f3f3f
#define TEST cout<<"stop here"<<endl
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;

const ll maxn = 2e6 + 7;
/*
struct node {
    ll a,b;
}m[maxn];
*/
int a[maxn],b[maxn];
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);

    ll n;
    while(cin>>n){
        ll i, j;
        for(i=1;i<=n;i++){
            cin>>a[i];
            a[i+n] = a[i];
        }
        for(i=1;i<=n;i++){
            cin>>b[i];
            b[i+n]= b[i];
        }

        ll mov = 0,cnt = 0,maxa = 0,maxb = 0,temp = 0;
        i = 1,j = 1;
        while(true){    
            while(maxa>=maxb && j-i+1<=n){
                maxa += a[j];
                maxb += b[j];
                j++;
            }
            if(temp<maxa){
                temp = maxa;
                mov = i;
            }
            if(maxa==maxb || (i>n && j>2*n-1))break;
            maxa -= a[i];
            maxb -= b[i];
            i++;
        }
        cout<< mov - 1 <<endl;
    }
    return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值