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 ;
}
本文来自博客园,作者:Qiansui,转载请注明原文链接:https://www.cnblogs.com/Qiansui/p/17608717.html