题意:给出n个格子,k种颜色,只能走相同颜色的格子,有1次机会改变任意格子颜色。
输入:分别输入n和k,后输入格子代表颜色1<=Ci<=k。
输出:选哪种格子,跨越木板数目最大值最少
思路:采用优先队列,将选择每种格子所跨越木板数目存入优先队列,映射一下,这里注意队列的大小,是否为空,当时因为这个一直wa2.
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
const int N = 1e6 + 100;
int n, m, t, k, ans;
int a[N], b[N];
priority_queue<int>c[N];
signed main()
{
cin >> t;
while (t--)
{
cin >> n >> k;
for (int i = 0; i <= k; i++)
{
while (!c[i].empty()) c[i].pop();
}
ans = INF;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (c[a[i]].empty())
{
c[a[i]].push(i - 1);
b[a[i]] = i;
ans++;
}
else
{
c[a[i]].push(i - b[a[i]] - 1);
b[a[i]] = i;
}
}
for (int i = 1; i <= k; i++) c[i].push(n - b[i]);
for (int i = 1; i <= k; i++)
{
if (c[i].size() > 1)//一定要判断队列大小
{
int ad = c[i].top();
c[i].pop();
int bd = c[i].top();
ans = min(ans, max(ad / 2, bd));
}
}
cout << ans << endl;
}
}