嘘~ 正在从服务器偷取页面 . . .

CF1966A Card Exchange 题解


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;
}

文章作者: q779
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 q779 !
评论
  目录