Codeforces Round #775 (Div. 2) ABCD题解
Posted ZZXzzx0_0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #775 (Div. 2) ABCD题解相关的知识,希望对你有一定的参考价值。
A. Game
题意:
n
个
只
包
含
0
和
1
的
数
组
,
你
一
开
始
在
a
[
1
]
位
置
,
求
走
到
a
[
n
]
位
置
的
最
小
代
价
n个只包含0和1的数组,你一开始在a[1]位置,求走到a[n]位置的最小代价
n个只包含0和1的数组,你一开始在a[1]位置,求走到a[n]位置的最小代价
如
果
a
[
i
]
=
a
[
i
+
1
]
=
1
,
你
可
以
从
i
走
到
i
+
1
,
代
价
为
0
如果a[i]=a[i+1]=1,你可以从i走到i+1,代价为0
如果a[i]=a[i+1]=1,你可以从i走到i+1,代价为0
如
果
a
[
i
]
=
a
[
j
]
=
1
[
i
<
j
]
,
你
可
以
从
i
走
到
j
,
代
价
为
j
−
i
,
只
能
走
一
次
如果a[i]=a[j]=1[i<j],你可以从i走到j,代价为j-i,只能走一次
如果a[i]=a[j]=1[i<j],你可以从i走到j,代价为j−i,只能走一次
思路:
因
为
第
二
种
走
法
只
能
走
一
次
因为第二种走法只能走一次
因为第二种走法只能走一次
所
以
找
到
第
一
个
连
续
的
一
的
最
后
一
个
位
置
L
所以找到第一个连续的一的最后一个位置L
所以找到第一个连续的一的最后一个位置L
和
最
后
一
个
连
续
的
一
的
第
一
个
位
置
R
和最后一个连续的一的第一个位置R
和最后一个连续的一的第一个位置R
答
案
即
为
R
−
L
答案即为R-L
答案即为R−L
时间复杂度:
O
n
On
On
int n ;
int a[N] ;
signed main()
cf
cin >> n ;
fer(i,1,n) sf(a[i]) ;
int l = -1 , r = -1 ;
fer(i,1,n)
if(!a[i])
l = i - 1 ;
break ;
der(i,n,1)
if(!a[i])
r = i + 1 ;
break ;
de(r - l) ;
return 0 ;
B. Game of Ball Passing
题意:
给
你
一
个
n
个
数
的
数
组
,
a
[
i
]
表
示
i
这
个
人
传
了
a
[
i
]
次
球
给你一个n个数的数组,a[i]表示i这个人传了a[i]次球
给你一个n个数的数组,a[i]表示i这个人传了a[i]次球
现
在
问
你
进
行
了
最
少
多
少
次
传
球
使
得
所
有
人
都
可
以
传
完
现在问你进行了最少多少次传球使得所有人都可以传完
现在问你进行了最少多少次传球使得所有人都可以传完
每
次
传
球
从
任
意
一
个
人
开
始
,
只
要
传
给
除
他
之
外
的
人
即
可
每次传球从任意一个人开始,只要传给除他之外的人即可
每次传球从任意一个人开始,只要传给除他之外的人即可
思路:
把
每
次
传
球
转
化
一
下
把每次传球转化一下
把每次传球转化一下
等
价
于
首
先
选
一
个
i
,
使
a
[
i
]
−
1
等价于首先选一个i,使a[i]-1
等价于首先选一个i,使a[i]−1
然
后
在
任
意
选
2
个
不
同
的
下
标
i
,
j
,
使
a
[
i
]
−
1
,
a
[
j
]
−
1
,
可
以
进
行
无
数
次
然后在任意选2个不同的下标i,j,使a[i]-1,a[j]-1,可以进行无数次
然后在任意选2个不同的下标i,j,使a[i]−1,a[j]−1,可以进行无数次
不
考
虑
首
先
选
一
个
i
,
使
a
[
i
]
−
1
的
情
况
下
不考虑首先选一个i,使a[i]-1的情况下
不考虑首先选一个i,使a[i]−1的情况下
记
录
一
下
数
组
总
和
s
u
m
和
数
组
最
大
值
m
a
x
v
记录一下数组总和sum和数组最大值maxv
记录一下数组总和sum和数组最大值maxv
如
果
s
u
m
−
m
a
x
v
>
=
m
a
x
v
如果sum-maxv>=maxv
如果sum−maxv>=maxv
说
明
一
次
传
球
即
可
说明一次传球即可
说明一次传球即可
考
虑
首
先
选
一
个
i
,
使
a
[
i
]
−
1
的
情
况
下
考虑首先选一个i,使a[i]-1的情况下
考虑首先选一个i,使a[i]−1的情况下
那
我
们
二
分
进
行
了
多
少
次
传
球
m
i
d
那我们二分进行了多少次传球mid
那我们二分进行了多少次传球mid
如
果
m
i
d
次
可
以
传
球
成
功
,
说
明
m
i
d
可
以
变
小
如果mid次可以传球成功,说明mid可以变小
如果mid次可以传球成功,说明mid可以变小
否
则
m
i
d
变
大
否则mid变大
否则mid变大
m
i
d
次
传
球
,
等
价
于
你
可
以
先
进
行
m
i
d
次
选
一
个
i
,
使
a
[
i
]
−
1
mid次传球,等价于你可以先进行mid次选一个i,使a[i]-1
mid次传球,等价于你可以先进行mid次选一个i,使a[i]−1
然
后
在
任
意
选
2
个
不
同
的
下
标
i
,
j
,
使
a
[
i
]
−
1
,
a
[
j
]
−
1
,
可
以
进
行
无
数
次
然后在任意选2个不同的下标i,j,使a[i]-1,a[j]-1,可以进行无数次
然后在任意选2个不同的下标i,j,使a[i]−1,a[j]−1,可以进行无数次
即 s u m − m a x v > = m a x v − m i d 即 可 即sum-maxv>=maxv-mid即可 即sum−maxv>=maxv−mid即可
时间复杂度: O n On On
int n ;
int a[N] ;
int s , v ;
int get(int mid)
if(s - v >= v - mid) return 1 ;
return 0 ;
signed main()
cf
cin >> n ;
fer(i,1,n) sf(a[i]) ;
s = 0 , v = 0 ;
fer(i,1,n) s += a[i] , v = max(v , a[i]) ;
if(!v)
puts("0") ;
continue ;
int l = 1 , r = 1e10 ;
while(l < r)
int mid = l + r >> 1 ;
if(get(mid)) r = mid ;
else l = mid + 1 ;
de(l) ;
return 0 ;
C. Weird Sum
题意: 以上是关于Codeforces Round #775 (Div. 2) ABCD题解的主要内容,如果未能解决你的问题,请参考以下文章 Codeforces Round #775 (Div. 2) ABCD题解 Codeforces Round #775 (Div. 2) ABCD题解 Codeforces Round #775 (Div. 2) ABCD题解 Codeforces Round #775 (Div. 2, based on Moscow Open Olympiad in Informatics)(ABCDE)
给
你
一
个
n
∗
m
的
方
格
,
每
个
方
格
c
[
i
]
[
j
]
都
有
一
个
颜
色
k
,
求
给你一个n*m的方格,每个方格c[i][j]都有一个颜色k,求
给你一个n∗m的方格,每个方格c[i][j]都有一个颜色k,求
∑
k
=
1
1
e
5
∑
x
1
=
1
n
∑
y
1
=
1
m
∑
x
2
=
i
+
1
n