A
题意:c1 + 2 * c2 = n;
构造c1和c2
思路:
可以根据样例得出结论:如果n%3大于0的话,c1 - c2 = 1
否则c2 = c1
B1
题意:两种颜色来填字符串满足两种颜色用的次数一样多,相同的字母不能涂相同的颜色,每个字母可以涂颜色可以不涂颜色,最大化被图的字母
输出一种颜色使用的次数
思路:
用map存下每个字母
遍历map计算sum += min(2, t.y);
sum最后除以2就是结果
B2
题意:是B的hard版给定k种颜色给字母涂色,每种颜色用的次数一样多,相同的字母不能涂相同的颜色,每个字母可以涂颜色可以不涂颜色,最大化被图的字母
打印涂色的序列
思路:
建立一个vector数组,记录每个相同的字母出现的位置
先计算sum
遍历vector数组sum += min(k, a[i].size());
sum = sum / k * k;(最大化被涂的颜色)
遍历vector数组涂色(p = (p + k) % k)涂的颜色
C
题意:这道题是给了abcde5个字母,这些字母会组成单词,找出一组单词这组单词中一个字母(主字母)的总数大于其他字母的总数之和,最大化这组单词的个数
思路:
建立string数组存所有的单词,
枚举这5个字母分别作为主字母,vector存每个单词中主字母占的比例,如果是主字母+1否则-1
sort从大到小排序,如果sum<= 0的话,更新ans
打印ans
D1
题意:n行m列的桌子,多米诺骨牌是两个格子组成的图形(水平或者竖直),给出k个水平的多米诺骨牌,剩下的只可以再桌子上填竖着的格子,问k个多米诺骨牌用完,是否可以填满nm格子
思路:
nm分奇偶用给定的k个横着的多米诺骨牌把桌子摆成n为偶数m为偶数(n,m >= 2)的桌子(在摆放过程中要考虑特殊情况判断yes或者no)
把nm的桌子分成2乘2的小方格小方格里面可以有两个横着的多米诺骨牌或者是两个竖着的多米诺骨牌所以只要判断k是否为偶数即可。
#include <bits/stdc++.h>
using namespace std;
int n, m, k, t;
int main()
{
cin >> t;
while (t -- )
{
cin >> n >> m >> k;
if (k == 0) {
if (n % 2) {
cout << "NO" << endl;
continue;
}
else {
cout << "YES" << endl;
continue;
}
}
if (n % 2)//行数为奇数
{
if (n == 1){
if (m / 2 == k) cout << "YES" << endl;
else cout << "NO" << endl;
}
else if (m / 2 > k) cout << "NO" << endl;
else {行和列都为偶数
k-=m/2,n--;
if (k % 2 == 0) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
else if (m % 2)//列数为奇数
{
if (n * (m - 1) / 2 < k) cout << "NO" << endl;
else{
m --;
if (k % 2 == 0) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
else//行和列都为偶数
{
if (k % 2 == 0) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
return 0;
}