CF1966A Card Exchange 题解
题目链接:Card Exchange
题意:
你有 $n$ 张卡片,每张卡片写着一个数 $a_i$ 。
给定一个正整数 $k$ ,定义一次操作为,选 $k$ 张数字相同的卡片,
然后把他们替换成 $k-1$ 张任意数字的卡片,这 $k-1$ 张上写的可以互不相同。
问最少可以持有多少张卡片。(下图是 $k=3$ 的例子)
输入格式:
$t (1\le t \le 500)$ 组数据
每组给出第一行 $n,k(1 \le n \le 100,2\le k \le 100)$ ,第二行给出 $a_i(1\le a_i \le 100)$ 。
输出格式:
对于每组数据,输出答案。
容易发现,只要有一种卡牌的数量超过 $k$ ,答案就是 $k-1$ ,否则一定是 $n$ 。
因为我们可以把超过 $k$ 张的那种卡片转换成相同的其他数字的卡片,进而消灭那种数字的多余牌数。
时间复杂度 $\mathcal{O}(tn)$ ,空间复杂度 $\mathcal{O}(V=\max a_i)$
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
void up(int &x,int y) { x < y ? x = y : 0; }
void down(int &x,int y) { x > y ? x = y : 0; }
#define N ((int)(666))
int a[N], c[N];
void clear()
{
memset(c, 0, sizeof(c));
}
void solve()
{
clear(); int n, k; cin >> n >> k;
for(int i = 1; i <= n; i++) { cin >> a[i], ++c[a[i]]; }
for(int i = 1; i <= n; i++) {
if(c[a[i]] >= k) { cout << k - 1 << '\n'; return; }
}
cout << n << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// freopen("check.in","r",stdin);
// freopen("check.out","w",stdout);
int qwq; cin >> qwq; while(qwq--) solve();
return 0;
}