题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6205
题目描述: 给你N个数字, 如果前N项和小于0 , 则结果是当前下标。 你可以做一种操作就是在开始之前旋转这个数组, 求最大结果
解题思路: 尺取啊....一个技巧就是拷贝原数组到原来数组后面, 然后用一把长度为N的尺子来尺取
代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#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; }
思考: 自己以前做过这种题啊.....就在这个博客园中啊, 这个拷贝的技巧自己应该会记得啊......记性是真的差, 尺取是针对连续区间的