题目链接:
http://www.codeforces.com/contest/675/problem/C
题意:
给一个数组,每个数与他相邻的数相连,第一个与最后一个相连,每个数的数值可以左右移动,问最少的移动次数使所有的数都为零。
题解:
把数组分成若干个部分,每个部分和都为0,每部分最多移动len-1,这样分的越多,得到的结果就越优。
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; const int maxn=101010; typedef __int64 LL; int n; LL sum[maxn]; int arr[maxn]; map<LL,int> mp; void init(){ mp.clear(); } int main(){ while(scanf("%d",&n)==1&&n){ init(); for(int i=1;i<=n;i++){ scanf("%d",arr+i); } sum[1]=arr[1]; mp[sum[1]]++; int ma=1; for(int i=2;i<=n;i++){ sum[i]=sum[i-1]+arr[i]; mp[sum[i]]++; if(mp[sum[i]]>ma) ma=mp[sum[i]]; } int ans=n-ma; printf("%d ",ans); } return 0; }