HDU 6205 card card card 尺取法

  题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6205

  题目描述: 给你N个数字, 如果前N项和小于0 , 则结果是当前下标。 你可以做一种操作就是在开始之前旋转这个数组, 求最大结果

  解题思路: 尺取啊....一个技巧就是拷贝原数组到原来数组后面, 然后用一把长度为N的尺子来尺取

  代码: 

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#include <set>
#include <queue>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define sca(x) scanf("%d",&x)
#define de printf("=======\n")
typedef long long ll;
using namespace std;

const int maxn = 2e6+100;
int n;
int a[maxn],b[maxn];

int main()
{
    while( scanf( "%d", &n ) == 1 ) {
        for( int i = 1; i <= n; i++ ) {
            scanf( "%d", a+i );
            a[i+n] = a[i];
        }
        for( int i = 1; i <= n; i++ ) {
            scanf( "%d", b+i );
            b[i+n] = b[i];
        }
        int ans = a[1] - b[1];
        int cnt = 1;
        for( int i = 2; i <= 2*n; i++ ) {
            ans += a[i] - b[i];
            if( i-cnt+1 == n ) break;
            if( ans < 0 ) {
                cnt = i+1;
                ans = 0;
            }
        }
        printf( "%d\n", cnt-1 );
    }
    return 0;
}
View Code

  思考: 自己以前做过这种题啊.....就在这个博客园中啊, 这个拷贝的技巧自己应该会记得啊......记性是真的差, 尺取是针对连续区间的

posted on 2017-09-11 09:58  FriskyPuppy  阅读(157)  评论(0编辑  收藏  举报

导航