Codeforces Round 941 (Div. 2) (A~D)
本题解思路是个人的和官方题解思路差别可能较大,仅供参考
A题:Card Exchange
标签: 贪心策略(greedy)
题目大意
- 给 n 张牌,每张牌上都写着一个数字,还有一个固定整数 k,可以多次进行下面的运算:
- 从手牌中任意选择 k 张数字相同的牌
- 将这些牌换成 k−1张牌,每张牌上数字任意
- 最少有多少张牌?
思路
- 分两种情况
- 如果有 k 张牌相同那么可以将其变为 k - 1张与剩下牌相同的牌,那么被变的牌又有了k张,重复此操作,最终一定会剩下k - 1张牌不会再变化
- 如果没有 k 张牌相同那么无法操作
以 4 4 4 9 5 5 k = 3 为例
将 4 4 4 变为 9 9 此时手牌为:9 9 9 5 5
将 9 9 9 变为 5 5 此时手牌为:5 5 5 5
将5 5 5 变为 5 5 此时手牌为:5 5 5
再将5 5 5 变为5 5 此时手牌为:5 5
无法再发生变化,可以证明这一定为最少手牌
AC代码
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int cnt[N];
void solve()
{
int n, k;
cin >> n >> k;
for(int i = 1; i <= 100; i++)
cnt[i] = 0;
int flag = 0;
for(int i = 0; i < n; i++)
{
int a; cin >> a;
cnt[a] ++;
if(cnt[a]>=k) flag = 1;
}
if(flag) cout << k -1 << endl;
else cout << n << endl;
}
int main()
{
int T; cin >> T;
while(T--)
solve();
return 0;
}
B题:Rectangle Filling
标签: 构造算法(constructive algorithms)
题目大意
- 有一个由白色和黑色方格组成的 n×m网格。在一次操作中,可以选择任意两个相同颜色的方格,并将它们之间的子方格中的所有方格都染成相同的颜色。
- 例如如下染色方式:
- 问题:网格中所有方格的颜色是否可能相同?
思路
- 结论:假设全部染成白色:那么在第一行,第一列,最后一行,最后一列一定都含有白色块
- 解释:
- 必须:如果第一列不含白色块,那么第一行全为黑色,如何染色也不可以将第一行全变为白色,最后一行,第一列,最后一行同理<