尺举法 1.初始化左端点,不断更新右端点;
2.满足条件,更新左端点,否则退出;
3.效率高于区间枚举,点的移动,复杂度O(n);
4..多数据输入,用scanf,否则超时;
#include <iostream>
using namespace std;
struct node{
int a;
int b;
};
node ne[2000010];
int main()
{
long long maxn,maxb,maxa,n,va;
while (cin>>n)
{
maxn=maxa=maxb=0;
va=1;
for (int i=1;i<=n;i++)
{
scanf("%d",&ne[i].a);
ne[i+n].a=ne[i].a; //扩展一次,方便循环;
}
for (int i=1;i<=n;i++)
{
scanf("%d",&ne[i].b);
ne[i+n].b=ne[i].b; //扩展一次,方便循环;
}
int i=1,j=1;
while (1)
{
while (maxa>=maxb&&j-i+1<=n)
{
maxa+=ne[j].a;
maxb+=ne[j].b;
j++;
}
if (maxa>maxn)
{
maxn=maxa;
va=i;
}
if (maxa==maxb||i>n)break; i大于n说明进入了扩展;maxa==maxb说明一次走完;
maxa-=ne[i].a;
maxb-=ne[i].b;
i++;
}
printf("%d\n",va-1);
}
return 0;
}