Codeforces Round #740 Div. 2 A B C D1 D2
Posted a碟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #740 Div. 2 A B C D1 D2相关的知识,希望对你有一定的参考价值。
目录
- A. Simply Strange Sort
- B. Charmed by the Game
- C. Deep Down Below
- D1. Up the Strip (simplified version)
- D2. Up the Strip
A. Simply Strange Sort
题目链接
题意: 给你一个从
1
−
n
1-n
1−n的排列数组,
n
n
n的长度是奇数,按照题目给定的要求对序列进行变换,求多少次变换之后能够使得数组递增。
分析: 简单的模拟题,主要是要读懂题意, f ( i ) f(i) f(i)代表如果 a i > a i + 1 a_i > a_i+1 ai>ai+1,则两者可以交换。每一次迭代变换,第i次的迭代规则:如果 i i i是奇数,对 1 , 3 , 5 , 7 , 9 1,3,5,7,9 1,3,5,7,9…奇数的位置的数字可以进行 f ( 1 ) , f ( 3 ) f(1),f(3) f(1),f(3)…的操作。如果i是偶数,对 2 , 4 , 6 , 8 , 10 2,4,6,8,10 2,4,6,8,10…偶数的位置可以进行 f ( 2 ) , f ( 4 ) f(2),f(4) f(2),f(4)的操作。按照题意模拟。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1005;
int a[N],n;
bool check()
for(int i=1;i<=n;i++)
if(a[i]==i)continue;
return false;
return true;
int main()
int t;scanf("%d",&t);
while(t--)
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int cnt=0,flag=0;
while(1)
if(check())break;
flag^=1;
int i=(flag?1:2);
for(;i<=n-1;i+=2)
if(a[i]>a[i+1])swap(a[i],a[i+1]);
cnt++;
printf("%d\\n",cnt);
return 0;
B. Charmed by the Game
题目链接
题意: 这个题太难读了…就是说有两个人打球,玩家轮流发球,发球方赢了,就说这一方 holds;接球方赢了,就说这一方
b
r
e
a
k
s
breaks
breaks。题目告诉我们两人的得分
a
,
b
a,b
a,b。求可能的
b
r
e
a
k
s
breaks
breaks的次数,也就是求接球方可能的拿分次数,也就是后手赢球的可能次数。
分析: 知道了两人的得分
a
,
b
a,b
a,b,那么我们就能知道总的比赛场次是
a
+
b
a+b
a+b,先手的发球次数是
⌈
a
+
b
2
⌉
\\lceil \\fraca+b2 \\rceil
⌈2a+b⌉为
p
p
p,后手的发球次数是
⌊
a
+
b
2
⌋
\\lfloor \\fraca+b2 \\rfloor
⌊2a+b⌋为
q
q
q。
我们不知道谁先发球,先假设
A
l
i
c
e
Alice
Alice先发球,设
x
x
x为
A
l
i
c
e
Alice
Alice发球的失球个数(
0
≤
x
≤
p
0\\leq x \\leq p
0≤x≤p),
y
y
y为
B
o
r
y
s
Borys
Borys的失球个数(
0
≤
y
≤
q
0\\leq y \\leq q
0≤y≤q)。
如果
A
l
i
c
e
Alice
Alice先手发球,枚举
A
l
i
c
e
Alice
Alice先手发球的失球个数
x
x
x(也就是后手赢球)从
1
1
1到
p
p
p,因为有
a
=
(
p
−
x
)
+
y
a=(p-x)+y
a=(p−x)+y,所以
y
=
a
−
(
p
−
x
)
y=a-(p-x)
y=a−(p−x),只要(
0
≤
y
≤
q
0\\leq y \\leq q
0≤y≤q),这就是一种合法的两者比赛的结果策略。
k
k
k的值就是
x
+
y
x+y
x+y。
同理,如果
B
o
r
y
s
Borys
Borys先手发球,枚举
B
o
r
y
s
Borys
Borys先手发球的失球个数
y
y
y(也就是后手赢球)从
1
1
1到
p
p
p,因为有
b
=
(
p
−
y
)
+
x
b=(p-y)+x
b=(p−y)+x,所以
x
=
b
−
(
p
−
y
)
x=b-(p-y)
x=b−(p−y),只要(
0
≤
x
≤
q
0\\leq x \\leq q
0≤x≤q),这就是一种合法的两者比赛的结果策略。
k
k
k的值就是
x
+
y
x+y
x+y。
计算上述有多少个
k
k
k的值。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
int main()
int t;scanf("%d",&t);
while(t--)
int a,b;
scanf("%d %d",&a,&b);
int p=a+b+1>>1,q=a+b>>1;//先手发球的次数和后手发球的次数
set<int>ans;
for(int i=0;i<=p;i++)//枚举alice先手时,每一种状态
int x=i,y=a-(p-x);//x是alice先手输球也就是break,y是Borys先手输球
if(y>=0&&y<=q)ans.insert(x+y);
for(int i=0;i<=p;i++)//枚举Broys先手输球
int y=i,x=b-(p-y);
if(x>=0&&x<=q)ans.insert(x+y);
printf("%d\\n",ans.size());
for(auto x:ans)printf("%d ",x);
printf("\\n");
return 0;
C. Deep Down Below
题目链接
题意: 玩家控制一个英雄,英雄有一个力量值。英雄要进入n个洞穴,洞穴i有k_i个怪物
a
i
,
1
,
a
i
,
2
,
.
.
.
a
i
,
k
a_i,1,a_i,2,...a_i,k
ai,1,ai,2,...ai,k,只要进入了一个洞穴,就必须按照顺序一一打败他们。英雄能够打败他们只有英雄的力量值严格大于怪物的护甲值,如果打不过则游戏失败。英雄每打败一个怪物,英雄的力量值+1。求最小的护甲值,使得英雄可以按照一定顺序进入洞穴,并打败所有怪物。
分析: 贪心。首先,我们需要确定进入一个洞穴时,英雄最低需要多少的力量值。 以上是关于Codeforces Round #740 Div. 2 A B C D1 D2的主要内容,如果未能解决你的问题,请参考以下文章 Codeforces Round #740 Div. 2 A B C D1 D2 Codeforces Round #740 (Div. 2) D1. Up the Strip (simplified version) Codeforces Round #740 (Div. 2) D1. Up the Strip (simplified version) Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))ABCD1D2E题解 Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))ABCD1D2E题解
因为英雄每打败一个怪物,英雄的护甲值
+
1
+1
+1。假设进入第一个洞穴英雄的力量值为
x
x
x,那么打完洞穴的第一个怪物,英雄的力量值变成
x
+
1
x+1
x+1,打完第二个怪物变成
x
+
2
x+2
x+2。所以只要保证对于第i个怪物的护甲值
y
i
y_i
yi,
x
+
i
−
1
>
y
i
x+i-1>y_i
x+i−1>yi即