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

Posted 欣君

tags:

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

视频讲解:BV1CN411Z76w

A. Mean Inequality

题目大意

给定一个包含 2 n ( 1 ≤ n ≤ 25 ) 2n(1 \\leq n \\leq 25) 2n(1n25) 个不同的数的数组 a a a ,求数组 b b b 使其满足以下条件:

  • b b b a a a 的一种排列
  • ∀ i ∈ [ 1 , 2 n ] \\forall i \\in [1,2n] i[1,2n] b i ≠ b i − 1 + b i + 1 2 b_i \\neq \\frac{b_{i-1}+b_{i+1}}{2} bi=2bi1+bi+1 ,其中 b 0 = b 2 n b_0=b_{2n} b0=b2n b 2 n + 1 = b 1 b_{2n+1}=b_{1} b2n+1=b1

题解

对于 b b b 中任意相邻的三个数,如果中间的数大于左右两个数,或小于左右两个数,那么必定可以满足条件。
对数组 a a a 排序,然后从小到大先填 b b b 中奇数位的数,再填偶数位的数。
那么得到的数组 b b b 中,奇数位的数必定小于相邻两个偶数位的数,偶数位的数必定大于相邻两个奇数位的数。

参考代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int MAXN=110;
int a[MAXN];

int main()
{
	int T,n,i;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		n*=2;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		sort(a+1,a+n+1);
		for(i=1;i<=n;i++)
		{
			if(i%2)
				printf("%d ",a[i/2+1]);
			else
				printf("%d ",a[i/2+n/2]);
		}
		puts("");
	}
}

B. I Hate 1111

题目大意

给定整数 x ( 1 ≤ x ≤ 1 0 9 ) x(1 \\leq x \\leq 10^9) x(1x109) ,判断其等否表示为若干的 11 , 111 , 1111 , 11111 , . . . 11,111,1111,11111,... 11,111,1111,11111,... 之和。
例如:

  • 33 = 11 + 11 + 11 33=11+11+11 33=11+11+11
  • 144 = 111 + 11 + 11 + 11 144=111+11+11+11 144=111+11+11+11

题解

会发现, 1111 = 11 ∗ 101 , 11111 = 11 + 111 ∗ 100 , . . . 1111=11 * 101,11111=11+111 * 100, ... 1111=11101,11111=11+111100,... 即这些数都能表示为 11 11 11 111 111 111 的组合。因此若 x x x 可以表示为 11 a + 111 b ( 0 ≤ a , b ) 11a+111b(0 \\leq a,b) 11a+111b(0a,b),则可以拆分,反之不行。
继续推导:
11 a + 111 b = 11 ( a + 10 b ) + b = x 11a+111b=11(a+10b)+b=x 11a+111b=11(a+10b)+b=x

b ≡ x ( m o d    11 ) b \\equiv x (mod \\; 11) bx(mod11)

a + 10 b = x − b 11 a+10b = \\frac{x-b}{11} a+10b=11xb

a = x − b 11 − 10 b ≥ 0 a=\\frac{x-b}{11}-10b \\geq 0 a=11xb10b0

b b b 最小为 x % 11 x \\% 11 x%11 ,因此 ⌊ x 11 ⌋ − 10 ( x % 11 ) ≥ 0 \\lfloor \\frac{x}{11} \\rfloor -10(x\\% 11) \\geq 0 11x10(x%11)0 则有解,反之不行。

参考代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int main()
{
	int T,x,y,n;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		y=n%11;
		if(n/11>=10*y)
			printf("YES\\n");
		else
			printf("NO\\n");
	}
}

C1+C2. Potions

题目大意

n ( 1 ≤ n ≤ 2 ⋅ 1 0 3 f o r    E a s y , 1 ≤ n ≤ 2 ⋅ 1 0 5 f o r    H a r d ) n(1 \\leq n \\leq 2 \\cdot 10^3 for \\; Easy,1 \\leq n \\leq 2 \\cdot 10^5 for \\; Hard) n(1n2103forEasy,1n2105forHard) 个点排列在直线上,每个点上有一瓶药水,喝下第 i i i 个点上的药水会使得生命值增加 a i ( − 1 0 9 ≤ a i ≤ 1 0 9 ) a_i(-10^9 \\leq a_i \\leq 10^9) ai(109ai109) ,如果为负值则表示会减少 ∣ a i ∣ |a_i| ai
初始生命中为 0 0 0 ,从左到右访问每个点,对于每瓶药水,可以选择喝它或无视它。求生命值始终为非负的情况下,最多能喝几瓶药水。

题解

动态规划解法(Easy)

d p i , j dp_{i,j} dpi,j 表示前 i i i 个点喝 j j j 瓶药水的情况下最后生命的最大值。
d p i , j = m a x ( d p i − 1 , j , d p i − 1 , j − 1 + a i ) dp_{i,j}=max(dp_{i-1,j},dp_{i-1,j-1}+a_i) dpi,j=max(dp

以上是关于Codeforces Round #723 div.2 A-F题解的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #723 (Div. 2)Codeforces-1526ABCD

Codeforces Round #723 (Div. 2)Codeforces-1526ABCD

Codeforces Round #723 (Div. 2)

Codeforces Round #723 (Div. 2), A. Mean Inequality

Codeforces Round #723 (Div. 2)B. I Hate 1111

Codeforces Round #723 (Div. 2)