Processing math: 100%

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

C_


CF1966A Card Exchange 题解

题目链接:Card Exchange

题意

你有 n 张卡片,每张卡片写着一个数 ai

给定一个正整数 k ,定义一次操作为,选 k 张数字相同的卡片,

然后把他们替换成 k1 张任意数字的卡片,这 k1 张上写的可以互不相同。

问最少可以持有多少张卡片。(下图是 k=3 的例子)

输入格式

t(1t500) 组数据

每组给出第一行 n,k(1n100,2k100) ,第二行给出 ai(1ai100)​ 。

输出格式

对于每组数据,输出答案。

容易发现,只要有一种卡牌的数量超过 k ,答案就是 k1 ,否则一定是 n

因为我们可以把超过 k 张的那种卡片转换成相同的其他数字的卡片,进而消灭那种数字的多余牌数。

时间复杂度 O(tn) ,空间复杂度 O(V=maxai)

代码:

cpp
#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 !
评论
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3
  目录