#2959. 还钱

还钱

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

题目背景

小明住在 S 城,这座城市是一个大圆圈。

题目描述

S 城有 nn 家银行,分布在大圆圈上,第 ii 家银行和第 i+1i+1 家相邻,特别的,第 nn 家银行和第 11 家相邻。他在第 ii 家银行存有 aia_i 元(aia_i 是整数)。特别的,aia_i 有可能是负数,表示他向这家银行借了钱。

S 城即将遭到 M 国的攻打,所以小明想要尽快和这些银行两清,把他在每家银行中的存款都变成 00,然后逃跑。

为了达成这个目标,他将会进行若干次转钱操作。

因为身上带太多现金不安全,所以每一次他会选择相邻的两家银行,从一家银行转(或者借)一些钱进另一家。即任意钦定一个整数 xx(可正可负),把相邻的 aia_iai+1a_{i+1}(或者 ana_na1a_1)一个加上 xx,另一个减去 xx

银行转钱的手续十分复杂,为了尽快逃跑,小明希望操作次数尽可能少,所以请你帮他计算出最少的次数。

输入格式

从文件 retmoy.in 中读入数据。

第一行,一个正整数 TT,表示数据组数。

接下来 TT 组数据,每组数据格式如下:

  • 第一行,一个正整数 nn,表示有多少家银行。
  • 第二行,nn 个整数 aia_i,表示小明在每家银行中的存款。

输出格式

输出到文件 retmoy.out 中。

TT 行,每行一个非负整数,表示最小的操作次数。

如果无论如何都无法达成目标,请输出 laycentral

样例 1

输入

2
2
-1 1
4
1 -2 3 1

输出

1
laycentral

解释

第一组数据,小明转一次钱即可:

  • 从第二家银行中转 11 元到第一家银行中;

第二组数据,不难发现小明无论如何也达不成目标。

样例 2

该样例符合测试点 565\sim 6 的限制。

输入

见下发文件中的 retmoy2.in

输出

见下发文件中的 retmoy2.out

样例 3

该样例符合测试点 7107\sim 10 的限制。

输入

见下发文件中的 retmoy3.in

输出

见下发文件中的 retmoy3.out

样例 4

该样例符合测试点 112511\sim 25 的限制。

输入

见下发文件中的 retmoy4.in

输出

见下发文件中的 retmoy4.out

样例 5

该样例符合测试点 112511\sim 25 的限制。

输入

见下发文件中的 retmoy5.in

输出

见下发文件中的 retmoy5.out

数据范围与提示

本题每个数据点等分。

定义 x={xx0xx<0|x|=\begin{cases}x&x\ge 0\\-x&x<0\end{cases}n\sum n 为所有 TT 组数据中 nn 的总和。

测试点编号:121 \sim 2n\sum n\leqslant 1010ai|a_i|\leqslant 1010

测试点编号: 343 \sim 4n\sum n\leqslant 1010ai|a_i|\leqslant 100100

测试点编号: 565 \sim 6n\sum n\leqslant 10610^6ai|a_i|\leqslant 00

测试点编号:7107 \sim 10n\sum n\leqslant 10310^3ai|a_i|\leqslant 10910^9

测试点编号:112511 \sim 25n\sum n\leqslant 10610^6ai|a_i|\leqslant 10910^9

如果你不会多组数据的读入,可以参考以下代码:

#include <iostream>
#include <cstdio>

using namespace std;

int n,a[1000005];

void run()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	// 在这里处理每一组数据
}

int main()
{
	int T;
	scanf("%d",&T);
	while(T-->0) run();
}

第二届小云雀杯决赛(中级组)

未参加
状态
已结束
规则
IOI
题目
4
开始于
2023-5-3 7:50
结束于
2023-5-3 9:56
持续时间
2.1 小时
主持人
参赛人数
147