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(1≤n≤25) 个不同的数的数组 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=2bi−1+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(1≤x≤109) ,判断其等否表示为若干的
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=11∗101,11111=11+111∗100,... 即这些数都能表示为
11
11
11 和
111
111
111 的组合。因此若
x
x
x 可以表示为
11
a
+
111
b
(
0
≤
a
,
b
)
11a+111b(0 \\leq a,b)
11a+111b(0≤a,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) b≡x(mod11)
a + 10 b = x − b 11 a+10b = \\frac{x-b}{11} a+10b=11x−b
a = x − b 11 − 10 b ≥ 0 a=\\frac{x-b}{11}-10b \\geq 0 a=11x−b−10b≥0
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 ⌊11x⌋−10(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(1≤n≤2⋅103forEasy,1≤n≤2⋅105forHard) 个点排列在直线上,每个点上有一瓶药水,喝下第
i
i
i 个点上的药水会使得生命值增加
a
i
(
−
1
0
9
≤
a
i
≤
1
0
9
)
a_i(-10^9 \\leq a_i \\leq 10^9)
ai(−109≤ai≤109) ,如果为负值则表示会减少
∣
a
i
∣
|a_i|
∣ai∣ 。
初始生命中为
0
0
0 ,从左到右访问每个点,对于每瓶药水,可以选择喝它或无视它。求生命值始终为非负的情况下,最多能喝几瓶药水。
题解
动态规划解法(Easy)
设
d
p
i
,
j
dp_{i,j}
dpi,j 表示前
i
i
i 个点喝
j
j
j 瓶药水的情况下最后生命的最大值。 以上是关于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
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