分享一道很有意思的题目 Codeforces Round 888 (Div. 3) — C. Tiles Comeback
题目简述:给一个长度为n的数组和一个数字k,一个元素ci代表一个颜色,希望你从数组中第一个元素从左往右跳(不一定只能跳相邻元素),得到一条长度为p的路径(被落地过的元素的数量),满足以下条件:1.一定要跳到n;2.p一定要被k整除;3.路径一定被分成长度为k的块;4.每个块中的颜色一定是相同的,而相邻块中的元素颜色不一定是不同的。问是否有可能会得到这样一条长度为p的路径?
思路:应该是笔者的一个技巧吧。首先看最前面和最后面一个元素是否相同,由于我们必须从第一个元素起点抵达最后一个元素终点,如果此时最前面和最后面元素相同,那么只要满足当前这个元素在数组中的数量大于等于k,就可以满足题意了,这是一种情况。剩余的情况也比较好想,我们只需要抓两个大头,即分别统计最左边的元素和最右边的元素在数组中的数量,只要满足最左边的元素的数量和最右边的元素的数量在某个交界点处均大于等于k,就可以满足题意了,中间的颜色可以不用管是因为,如果两端都能找到,那么路径长度与k必然是倍数关系,于是就显得不重要了。
import sys
input = sys.stdin.readline
def solve():
n, k = map(int, input().split())
arr = list(map(int, input().split()))
if arr[0] == arr[-1]:
if arr.count(arr[0]) >= k:
print("YES")
return
count1,count2 = 0,arr.count(arr[-1])
for i in range(n):
count1 += (arr[i] == arr[0])
count2 -= (arr[i] == arr[-1])
# 交界点
if count1 >= k and count2 >= k:
print("YES")
return
print("NO")
def main():
t = int(input())
while t:
solve()
t -= 1
main()
比赛代码,若有建议,欢迎评论区交流,感激不尽!