目录
题目:
题目描述:
给你 n ,k ,再给你长度为 n 的数组代表瓷砖颜色。现在你站在第一块瓷砖上,要走到最后一块瓷砖。问你是否可以找到一个子串,满足以下要求:
①字串必须第一位和末位
②字串长度 p 是 k 的倍数
③字串可以被分为多个连续块,每个块长度为 k
④每个块中的颜色必须相同,相邻的块颜色可以不同
如果能找到这样的字串就输出 yes ,不能就输出 no
思路:
我们可以知道,首尾的那两个瓷砖是肯定在字串里的,所以可以用一种贪心的思想,我们必须至少要满足这两块瓷砖。并且满足这两块就够了,题目并没有要求找出最多 block 的情况,所以更多的 block 情况就算能满足,我们也懒得管。
思路有了,具体操作请看 AC 代码
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int a[N];
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--)
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
if (a[1] == a[n])//首尾瓷砖颜色相同
{
for (int i = 1; i <= n; i++)
{
if (a[i] == a[1])
k--;
}
if (k <= 0)
cout << "YES" << '\n';
else
cout << "NO" << '\n';
}
else//首尾瓷砖颜色不同
{
int k1 = k;//从首瓷砖开始的三个同色
int k2 = k;//从尾瓷砖结束的三个同色
for (int i = 1; i <= n; i++)
{
if (k1)//先找首瓷砖开始的三个同颜色
{
if (a[i] == a[1])
k1--;
}
else if (k2)//满足了首瓷砖的,再找尾瓷砖的同颜色瓷砖
{
if (a[i] == a[n])
k2--;
}
}
if (k2 == 0)//尾瓷砖的k个都满足了,肯定可以
cout << "YES" << '\n';
else
cout << "NO" << '\n';
}
}
return 0;
}