AtCoder Beginner Contest 313 - A B C

比赛地址:传送门
感觉 ABC 难度上来了,然后我就烂透了

A - To Be Saikyo

简单题
判断第一个元素是不是严格最大的元素,如果是,输出 0 ;如果不是,输出数组最大值 + 1 - 第一个元素

void solve(){
	int n;
	cin >> n;
	vector<int> a(n);
	for(int i = 0; i < n; ++ i){
		cin >> a[i];
	}
	cout << max(0, *max_element(a.begin() + 1, a.end()) + 1 - a[0]) << '\n';
	return ;
}

B - Who is Saikyo?

题意
一共有 n 个选手,给出 m 条关系,表示选手 A 比选手 B 强
问你通过这 m 条关系,能否确定某一位选手比剩余的选手都强?

思路
目前关系中,没人比你强,你就是最强了!
所以,我们对 m 条关系中的选手 B 打上标记,再遍历整个数组,判断是否仅只有一个选手没有人比他强即可

代码

void solve(){
	int n, m;
	cin >> n >> m;
	vector<int> in(n + 1);
	for(int i = 0; i < m; ++ i){
		int a, b;
		cin >> a >> b;
		++ in[b];
	}
	bool f = false;
	int ans = -1;
	for(int i = 1; i <= n; ++ i){
		if(in[i] == 0){
			if(f){
				ans = -1; break;
			}else{
				ans = i; f = true;
			}
		}
	}
	cout << ans << '\n';
	return ;
}

C - Approximate Equalization 2

题意
给你一个长为 n 的序列A。你可以执行一种操作:任意选择序列里的两个数,使得其中一个 -1,另一个 +1
请你输出最小的操作次数使得整个序列的极差最多是 1

思路
显然,无论怎么操作,所有数的和 sum 是不变的,要使得最后的极差不超过 1,那么所有数至少是 $d = \lfloor \frac{sum}{n} \rfloor $,余数 \(yu = sum % n\) 说明其中需要有 \(yu\)\(d + 1\),剩下的都是 d。
那么最终的数组确定了,还需要确定最小的次数。显然是小的优先变成 d,大的优先变成 d + 1,所以我们可以先对数组进行排序,再从前往后统计其与最终数组每个位置差的绝对值之和,再除以 2,即为最终答案

代码

const int maxm = 2e5 + 5, inf = 0x3f3f3f3f, mod = 998244353;
ll n, a[maxm];

void solve(){
	cin >> n;
	ll sum = 0;
	for(int i = 0; i < n; ++ i){
		cin >> a[i];
		sum += a[i];
	}
	ll d = sum / n, yu = sum % n, ans = 0;
	sort(a, a + n);
	for(int i = 0; i < n; ++ i){
		ans += abs(d + (i + yu >= n) - a[i]);
	}
	cout << ans / 2 << '\n';
	return ;
}
posted on 2023-08-05 21:49  Qiansui  阅读(36)  评论(0编辑  收藏  举报