http://acm.hdu.edu.cn/showproblem.php?pid=6205
给你两个数列,长度都为n。
让上面的数减去下面的。求和。
由于条件性质,可以知道肯定会有一种排列,是可以的。
当和为负数时,结束(包含这一项),
可以通过把后面的数对放在前面来让他经过的数对更多。。问你最少要转移多少个、
思路1 ,模拟。。扫一遍。。我不知道这叫啥算法。牟神太强了。
思路2 模拟, 每次当为负数时,就记录他的下标,然后把这一个全移到下面。,
#include <bits/stdc++.h>
using namespace std;
/* 这个是最简洁的写法了。
有直接模拟硬艹的,
有 用线段树艹的
但是这个我认为还是比较好的,
*/
const int maxn=1e6+1000;
int m;
int a[maxn],b;
int c[maxn];
int main()
{ int t;
//scanf("%d",&t);
while(~scanf("%d",&m)){
//scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d",&b);
c[i]=a[i]-b;
}
int ans=0;
int all=0;
for(int i=1;i<=m;i++){
if(all+c[i]<0)
{ all=0;
ans=i;
}
else
all+=c[i];
}
printf("%d\n",ans);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
/* 这个是最简洁的写法了。
有直接模拟硬艹的,
有 用线段树艹的
但是这个我认为还是比较好的,
*/
const int maxn=1e6+1000;
int m;
int a[maxn],b;
int c[maxn];
int main()
{ int t;
//scanf("%d",&t);
while(~scanf("%d",&m)){
//scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
scanf("%d",&b);
c[i]=a[i]-b;
}
int ans=0;
int all=0;
for(int i=1;i<=m;i++){
all+=c[i];
while(all<0)
all-=c[++ans];
}
printf("%d\n",ans);
}
return 0;
}