Codeforces Round #726 div.2 A-F题解

Posted 欣君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #726 div.2 A-F题解相关的知识,希望对你有一定的参考价值。

视频讲解:TBD

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}^{n}{a_i} sum=i=1nai ,有以下两种情况:

  1. s u m < n sum < n sum<n ,则再添加一个数值为 n − s u m + 1 n-sum+1 nsum+1 的元素,即可成立;
  2. s u m ≥ n sum \\geq n sumn ,则再添加 s u m − n sum-n sumn 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) 位置,会得到一个最优解。判断哪种方案距离更长即可。

参考代码

#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);
		if(min(i-1+j-1,n-i+m-j)>min(i-1+m-j,n-i+j-1))
			printf("%d %d %d %d\\n",1,1,n,m);
		else
			printf("%d %d %d %d\\n",1,m,n,1);
	}
}

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| h1hn 最小时,满足条件 h i < h i + 1 ( 1 ≤ i < n ) h_i < h_{i+1}(1 \\leq i < n) hi<hi+1(1i<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(1i<n)
接下来考虑使得 ∣ h 1 − h n ∣ |h_1-h_n| h1hn 最小,找到最小的 h j + 1 − h j h_{j+1}-h_j hj+1hj ,将第 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 有以下三种状态:

  1. 奇数;
  2. 不为 2 2 2 的整数次幂的偶数;
  3. 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) nx=x(y1) ,其中 x x x 为奇数,因此 n − x = x ( y − 1 ) n-x=x(y-1) nx=x(y1) 必定是不为 2 2 2 的整数次幂的偶数。

对于不为 2 2 2 的整数次幂的偶数,有以下两种变化方案:

  1. 减去一个奇因数 x 1 x1 x1 ,变成奇数;
  2. 减去一个偶因数 x 2 x2 x2 ,变为偶数;

若执行方案1,减去一个奇因数 x 1 x1 x1 ,变成奇数后,则对手只能将其再减去一个奇数变回不为 2 2 2 的整数次幂的偶数,或直接面对一个奇素数的必败状态。
因此不为 2 2 2 的整数次幂的偶数是必胜状态,奇数是必败状态。

对于 2 2 2 的整数次幂 2 k 2^k 2k,有以下两种变化方案:

  1. 减去 2 p ( 1 ≤ p ≤ k − 2 ) 2^p(1 \\leq p \\leq k-2) 2p(1pk2) ,变为不为 2 2 2 的整数次幂的偶数 2 p ∗ ( 2 k − p − 1 ) 2^p*(2^{k-p}-1) 2p(2kp1) ,即必胜状态;
  2. 减去 2

    以上是关于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题解

    Codeforces Round #726 div.2 A-F题解

    Codeforces Round #726 (Div. 2)D博弈