Codeforces Round #726 div.2 A-F题解
Posted 欣君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #726 div.2 A-F题解相关的知识,希望对你有一定的参考价值。
视频讲解:BV1Hy4y1M74u
A. Arithmetic Array
题目大意
给定一个包含 n n n 个整数的数组 a a a ,求最少需要向数组 a a a 中添加多少个非负整数,使得数组的算术平均数恰好等于 1 1 1 。
题解
设 s u m = ∑ i = 1 n a i sum=\\sum_i=1^na_i sum=∑i=1nai ,有以下两种情况:
- 若 s u m < n sum < n sum<n ,则再添加一个数值为 n − s u m + 1 n-sum+1 n−sum+1 的元素,即可成立;
- 若 s u m ≥ n sum \\geq n sum≥n ,则再添加 s u m − n sum-n sum−n 个 0 0 0 元素,即可成立;
参考代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
int T,n,x,sum,i;
scanf("%d",&T);
while(T--)
scanf("%d",&n);
sum=0;
for(i=1;i<=n;i++)
scanf("%d",&x);
sum+=x;
if(sum-n<0)
printf("1\\n");
else
printf("%d\\n",sum-n);
B. Bad Boy
题目大意
在一个
n
n
n 行
m
m
m 列的网格上,初始在
(
i
,
j
)
(i,j)
(i,j) 位置,每次可以向上下左右四个方向之一移动一格。
现在在网格上任意位置放置两个悠悠球,求如何放置这两个悠悠球,使得从
(
i
,
j
)
(i,j)
(i,j) 出发,捡到两个悠悠球,再回到初始位置的路径最长。
题解
两个悠悠球在对角的两个角落,即 ( 1 , 1 ) (1,1) (1,1) 和 ( n , m ) (n,m) (n,m) 位置,或 ( 1 , m ) (1,m) (1,m) 和 ( n , 1 ) (n,1) (n,1) 位置,总路程最长,均为 2 n + 2 m 2n+2m 2n+2m 。输出任意解即可。
参考代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
int T,n,m,i,j;
scanf("%d",&T);
while(T--)
scanf("%d%d%d%d",&n,&m,&i,&j);
printf("%d %d %d %d\\n",1,1,n,m);
C. Challenging Cliffs
题目大意
给定
n
n
n 座山,每座山的高度为
h
i
h_i
hi 。将其按任意顺序排列在一条直线上,从左到右编号为
1
1
1 到
n
n
n 。
求
∣
h
1
−
h
n
∣
|h_1-h_n|
∣h1−hn∣ 最小时,满足条件
h
i
<
h
i
+
1
(
1
≤
i
<
n
)
h_i < h_i+1(1 \\leq i < n)
hi<hi+1(1≤i<n) 的
i
i
i 最多时的排列方案。
题解
将
h
i
h_i
hi 递增排序后,必定有最多的
i
i
i 满足
h
i
<
h
i
+
1
(
1
≤
i
<
n
)
h_i < h_i+1(1 \\leq i < n)
hi<hi+1(1≤i<n) 。
接下来考虑使得
∣
h
1
−
h
n
∣
|h_1-h_n|
∣h1−hn∣ 最小,找到最小的
h
j
+
1
−
h
j
h_j+1-h_j
hj+1−hj ,将第
j
+
1
j+1
j+1 到
n
n
n 座山全部移到第
1
1
1 座山前面即可。
注意如果只有两座山时,由于代码写法不同,可能需要特殊考虑。
参考代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int MAXN=200200;
int h[MAXN];
int main()
int T,n,i,mn,id;
scanf("%d",&T);
while(T--)
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&h[i]);
sort(h+1,h+n+1);
mn=h[n]-h[1];
id=n;
for(i=1;i<n;i++)
if(h[i+1]-h[i]<mn)
mn=h[i+1]-h[i];
id=i;
for(i=id+1;i<=n;i++)
printf("%d ",h[i]);
for(i=1;i<=id;i++)
printf("%d ",h[i]);
puts("");
D. Deleting Divisors
题目大意
Alice 和 Bob 进行博弈游戏。
初始给定一个正整数
n
n
n ,每轮将其减去
x
x
x ,
x
x
x 为
n
n
n 的因数且不为
1
1
1 或
n
n
n ,无法操作时失败,Alice先手。
双方均采用最优策略,求谁获胜。
题解
n n n 有以下三种状态:
- 奇数;
- 不为 2 2 2 的整数次幂的偶数;
- 2 2 2 的整数次幂;
对于奇数,其只能变成不为 2 2 2 的整数次幂的偶数。证明:
- 设 n = x y n=xy n=xy ,减去一个合法因数 x x x 后, n − x = x ( y − 1 ) n-x=x(y-1) n−x=x(y−1) ,其中 x x x 为奇数,因此 n − x = x ( y − 1 ) n-x=x(y-1) n−x=x(y−1) 必定是不为 2 2 2 的整数次幂的偶数。
对于不为 2 2 2 的整数次幂的偶数,有以下两种变化方案:
- 减去一个奇因数 x 1 x1 x1 ,变成奇数;
- 减去一个偶因数 x 2 x2 x2 ,变为偶数;
若执行方案1,减去一个奇因数
x
1
x1
x1 ,变成奇数后,则对手只能将其再减去一个奇数变回不为
2
2
2 的整数次幂的偶数,或直接面对一个奇素数的必败状态。
因此不为
2
2
2 的整数次幂的偶数是必胜状态,奇数是必败状态。
对于 2 2 2 的整数次幂 2 k 2^k 2k,有以下两种变化方案:
- 减去 2 p ( 1 ≤ p ≤ k − 2 ) 2^p(1 \\leq p \\leq k-2) 2p(1≤p≤k−2) ,变为不为 2 2 2 的整数次幂的偶数 2 p ∗ ( 2 k − p − 1 ) 2^p*(2^k-p-1) 2p∗(2k−p−1) ,即必胜状态;
- 减去
2
k
−
1
2^k-1
2k−1 ,变为 以上是关于Codeforces Round #726 div.2 A-F题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #726 (Div. 2) D题解
Codeforces Round #726 (Div. 2)(补题)
Codeforces Round #726 (Div. 2) A. Arithmetic Array
Codeforces Round #726 div.2 A-F题解