专栏文章

题解:P14566 【MX-S12-T1】取模

P14566题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@min32vw0
此快照首次捕获于
2025/12/01 19:46
3 个月前
此快照最后确认于
2025/12/01 19:46
3 个月前
查看原文

思路

对于任意正整数 pp,余数的取值范围是 [0,p1][0, p-1],当余数同时包含 00p1p-1 时,得分为 p1p-1
  1. 选择足够大的 pp(如 p>max(a)p > \max(a)),此时余数就是原数,得分为 max(a)min(a)\max(a) - \min(a)
  2. 选择 p=max(a)p = \max(a),此时最大余数是次大值,最小余数是 00,得分为次大值。

步骤

  1. 对数组排序并去重(要是严格次大值);
  2. 如果去重后只剩一个元素,得分为 00;否则,答案为极差和次大值中的最大值。

代码实现

CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[100010];
signed main(){
	int T;
	cin>>T;
	int mod;
	int ans=0;
	int n;
	while(T--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		sort(a+1,a+n+1);
		n=unique(a+1,a+n+1)-(a+1);
		ans=max(a[n]-a[1],a[n-1]);
		cout<<ans<<"\n";
	}
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...