Educational Codeforces Round 189 (Rated for Div. 2)

A. A Number Between Two Others

考点:数学

思路:

因为题目要求且。这个条件可以转换为(因为y能被x整除,相当于y是x的k倍)。同理也可以转换为。

题目又说,于是我们可以继续转换一下。

又因为。

当k==2的时候,这样的m根本就不可能存在。于是k的取值就只能是。

所以最后结论就是:。

复杂度:O(1)

python 复制代码
import sys
input=sys.stdin.readline
t=int(input())
for _ in range(t):
    x,y=map(int,input().split())
    if y//x>2:
        print("YES")
    else:
        print("NO")

B. Alternating String

考点:贪心

思路:

题目要我们判断这个字符串能不能通过操作使其成为交替字符串,那我们可以把题目简化为找,相邻两个字符相同的个数,如果相邻的两个字符个数大于2串,就肯定是不行的。因为他直接替换字符的操作最多只能使用一次。

复杂度:O(n)

python 复制代码
import sys
input=sys.stdin.readline
t=int(input())
for _ in range(t):
    s=input().strip()
    n=len(s)
    i=1
    cnt=0
    for i in range(n-1):
        if s[i]==s[i+1]:
            cnt+=1
    if cnt>2:
        print("NO")
    else:
        print("YES")

C. Red-Black Pairs

考点:线性dp

思路:

因为他是一个2*n的表格,所以只可能有两种染色方法,第一种就是用一列的,第二种就是用两行的,因为你用了一行默认就是要用两行,因为行数是2。

于是我们就可以分两种情况来讨论:

当是一竖列的时候:

我们只需要计算把第i列变成同色的代价。

当是两个横列的时候:

我们计算构成的2*2的区域中,第一排变成相同颜色的代价和加上第二排变成同色的代价。

。

所以最终状态转移方程

复杂度:O(n)

python 复制代码
import sys
input=sys.stdin.readline
t=int(input())
for _ in range(t):
    n=int(input())
    a=input().strip()
    b=input().strip()
    #dp[i]表示前i列完成合法分割与涂色的最小修改次数
    dp=[0]*(n+1)
    for i in range(1,n+1):
        c=i-1
        #选择1,当前列自己做为一个竖向对,两个格子如果颜色不同,代价为1,相同则代价为0
        cost_v=1 if a[c]!=b[c] else 0
        dp[i]=dp[i-1]+cost_v
        #选择2:当前列和前一列合并,变成两个横向对
        if i>=2:
            top=1 if a[c]!=a[c-1] else 0
            bot=1 if b[c]!=b[c-1] else 0
            zh=top+bot
            dp[i]=min(dp[i],dp[i-2]+zh)
    print(dp[n])

D. Exceptional Segments

考点:前缀和,状态压缩,数学

思路:

一开始我是用O(n)的写法写的,但是发现超时了。于是就把数字往后列了几个,发现这个前缀和其实是有规律的,他会是四个四个的一组,然后每次当除以4的余数为0和3的时候才是0,他为了让左右两部分相等,那么也就是其实只用找余数为0和余数为3的点就行了。

复杂度:O(1)

python 复制代码
import sys
input=sys.stdin.readline
mod=998244353
def count_0(m):
    if m<0:
        return 0
    return 1+(m+1)//4
def count_1(m):
    if m<0:
        return 0
    return (m+3)//4
t=int(input())
for _ in range(t):
    n,x=map(int,input().split())
    l0=count_0(x-1)
    l1=count_1(x-1)
    r0=count_0(n)-count_0(x-1)
    r1=count_1(n)-count_1(x-1)
    ans=(l0*r0+l1*r1)%mod
    print(ans)
相关推荐
飞Link11 小时前
什么是 PX4?一文了解 PX4 在空地协同中的作用
算法·无人机
一去不复返的通信er17 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
wangchunyu11419 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
程序 代码狂人20 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade21 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
2501_9445215921 小时前
Immer 跨端三方库仓颉适配全流程
python·eclipse·django
信誓旦旦的程序猿21 小时前
【Python量化实战宝典 #26】止损与回撤控制手册:移动止损、最大回撤(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
2501_9445215921 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
Patrick在香港21 小时前
同一行 strftime,两台机器跑出两种日期
python·datetime·时区·locale·日期处理
2601_9679873721 小时前
用Python+OpenCV+YOLO写个游戏脚本:从自动瞄准到自动采集的保姆级教程
python·opencv·yolo·目标检测·游戏自动化