还钱(c++)

题目背景

小明住在 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); 
		} 
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值