题目背景
小明住在 S 城,这座城市是一个大圆圈。
题目描述
S 城有 n 家银行,分布在大圆圈上,第 i 家银行和第 i+1 家相邻,特别的,第 n 家银行和第 1 家相邻。他在第 i 家银行存有 ai 元(ai 是整数)。特别的,ai 有可能是负数,表示他向这家银行借了钱。
S 城即将遭到 M 国的攻打,所以小明想要尽快和这些银行两清,把他在每家银行中的存款都变成 0,然后逃跑。
为了达成这个目标,他将会进行若干次转钱操作。
因为身上带太多现金不安全,所以每一次他会选择相邻的两家银行,从一家银行转(或者借)一些钱进另一家。即任意钦定一个整数 x(可正可负),把相邻的 ai 和 ai+1(或者 an 和 a1)一个加上 x,另一个减去 x。
银行转钱的手续十分复杂,为了尽快逃跑,小明希望操作次数尽可能少,所以请你帮他计算出最少的次数。
输入格式
第一行,一个正整数 T,表示数据组数。
接下来 T 组数据,每组数据格式如下:
- 第一行,一个正整数 n,表示有多少家银行。
- 第二行,n 个整数 ai,表示小明在每家银行中的存款。
输出格式
共 T 行,每行一个非负整数,表示最小的操作次数。
如果无论如何都无法达成目标,请输出 laycentral
。
样例 1
输入
2
2
-1 1
4
1 -2 3 1
输出
1
laycentral
解释
第一组数据,小明转一次钱即可:
- 从第二家银行中转 1 元到第一家银行中;
第二组数据,不难发现小明无论如何也达不成目标。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1e6 + 10;
int t , n , a[N];
signed main(){
scanf("%lld" , &t);
while( t-- ){
scanf("%lld" , &n);
for(int i = 1; i <= n; i++){
scanf("%lld" , &a[i]);
a[i] += a[i - 1];
}
if( a[n] )printf("laycentral\n");
else{
sort( a + 1 , a + n + 1);
int cnt = 1;
int maxx = 1;
for(int i = 2; i <= n; i++){
a[i] == a[i - 1] ? cnt++ : cnt = 1;
maxx = max(maxx , cnt);
}
printf("%lld\n" , n - maxx);
}
}
}