#include<iostream> #include<cstdio> #include<vector> #include<algorithm> #define ll long long usingnamespacestd; constint maxn = 1e6 + 10; int n, m, t; int a[maxn]; int vis[maxn]; int fa[maxn]; intmain() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) { while (vis[a[i]]) { int tmp = a[i]; a[i] += vis[a[i]]; vis[tmp]++; } vis[a[i]] = 1; } for (int i = 1; i <= n; i++) cout << a[i] << " "; return0; }
I. 糖果
题目描述:
$ M $ 种口味糖果,每包 $ K $ 颗,总共 $ N $ 包,给出每一包的口味,最少买几包,可以品尝所有的口味
数据范围: $ 1\le N \le 1e2, 1\le M \le 20, 1\le K \le 20, 1\le t_i \le M $
题解:
数据范围很小,考虑使用二进制标记状态,这样的话每一包糖果的口味就是一个 $ int $ ,多包就是或起来。因此可以考虑使用状态 $ dp $ , $ dp[i] $ 表示状态为 $ i $ 时所需的最小包数。比较简单