题目描述
禾木上了小学,今天学习了求余,现在她有包含 �n 个数字的数组,她每次可以从这些数字中任选两个数字 �,�A,B,从数组中删除这两个数字。然后进行一次求余操作,可以是 �%�A%B,也可以是 �%�B%A,将求余之后得到的新数字加入数组中。
删除了两个数字,加入了一个数字,所以数组的数字个数减少了一个,经过 �−1n−1 次操作之后,她得到了一个数字。现在她想让最后剩余的这一个数字尽可能大,请问这个数字最大是多少?
输入格式
第一行输入一个正整数 �n,表示数字的个数。接下来一行包含 �n 个正整数,其中第 �i 个正整数为 ��(1≤��≤106)ai(1≤ai≤106),保证所有数字均不同。
输出格式
输出一行一个正整数表示答案。
输入数据 1
3
100 200 301
Copy
输出数据 1
100
Copy
说明
先拿出 200 和 301,用 301 对 200 求余,得到 101。然后数组中还剩 100 和 101,用 100 对 101 求余,得到 100,是能够生成的最大的数字。生成的方案不唯一,但是无法生成一个比 100 还大的数字了。
测试点说明
测试点编号 | �≤n≤ |
---|---|
1-2 | 2 |
3-4 | 3 |
5-10 | 105105 |
大样例
题目翻译:
已知�n个数,可选择任意两个数进行取余,删除所选两数并将取余结果放回数组。在�−1n−1次取余后,问最大值是多少。
分析:
对于任意�n个数,�−1n−1次取余后的结果 ���ans ⩽ 这�n个数中的最小值 ����minn 证明: 设前 �−1n−1 取余结果为 �x 则 当 ���ans = �x % ����minn 时,���ans < ����minn 当 ���ans = ����minn % �x 时,���ans ⩽ ����minn 而此时若�x > ����minn 时,���ans = ����minn
那么能否保证�x > ����minn ? 可以。 只需每次用当前次大值取余最大值,结果就一定比 ����minn 大。实际上,只需将数从小到大排列,在用前一项对后一项取余,就可以得到最大值。
结论:
答案为 �n 个数中的最小值
#include <bits/stdc++.h>
using namespace std;
int n, a[1000000], minn = 100000;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
for (int i = 1; i <= n; i++)
{
minn = min(minn, a[i]);
}
cout << minn;
return 0;
}