第一道题目链接: https://codeforces.com/problemset/problem/1918/A
代码如下(注释是写这道题的想法)
写codeforces题目跟我写蓝桥或者acwing上的题目给我这个蒟蒻的一个很大的不同就是:题目很难理解,但代码很简单.只有20行左右,有什么好思考的呢?对呀!
这道题最终的答案要的是两个不同方向(横与竖)的差的max值,这就需要我们知道什么状态是横,竖;当我们针对性地得到这个问题的答案之后,接下来就是去模拟样例,考虑最简单的贪心思路.
不难发现答案要的是: max(横向砖的数目 - 纵向转的数目),那么我们不妨直接将纵向砖的数目归为零,因为横向砖的宽是固定的,长度却是>=2的变量.所我们可以用横向砖表示任何符合题意的面积值(面积 >= 2),这就是最优贪心策略.
这道题之后就是我对另一道蓝桥杯题目的联想~
//首先我的阅读能力不强,一开始没搞懂水平和数值放置是什么意思,但现在懂了
//题意和需求有关,掌握了需求,方便于理解题意
#include <iostream>
#include <cstring>
#include <algorithm>
//把这道题和第一次参加蓝桥杯算法赛的那道题比较一下!!!
using namespace std;
int main()
{
int n ; scanf("%d",&n);
int cnt;
while(n--)
{
cnt = 0;
int n,m;
scanf("%d%d",&n,&m);
m /= 2;
cnt = m * n;
printf("%d\n",cnt);
}
return 0;
}
蓝桥杯的题目链接如下: https://www.lanqiao.cn/problems/5887/learning/?page=1&first_category_id=1&name=%E9%93%BA
这两道题处理的都是地板砖问题.但蓝桥这道题单个地板砖的面积是固定的: 2 * 3;接下来我们慢慢分析即可~
首先肯定是铺满了系统输入的面积 : n * m ,所以这个面积一定是单个地板砖面积的倍数,这个是最基本的条件,转化为代码就是:n * m % 6 == 0;其他情况(else)一定是铺不满的.
然后满足最基本的条件之后,也就是考虑完面积的问题之后,接下来考虑边长的问题~
边长肯定要符合题目的规格.接下来考虑状态
1)考虑全横或全竖的状态,对应代码就是:(n % 2 == 0 && m % 3 == 0) || (n % 3 == 0 && m % 2 == 0);
2)考虑纵横交错的状态.如果砖块中出现了不是3的倍数的奇数长度边,例如7,那么不难模拟出来,能用多个2和3两个数字构造出奇数只有当3的个数为奇数并且不为0时才可以,代码就是:
((n - 1) % 2 == 0 ) && (n-1);
又因为这道题只考虑摆放,不考虑不同转向的砖的数目,所以另一个方向也有可能发生:
((m - 1) % 2 == 0 ) && (m-1);
其他情况都是”No”的.
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
int t; scanf("%d",&t);
while(t--)
{
int n,m; scanf("%d%d",&n,&m);
if(n * m % 6 == 0)
{//分析的很重要的一点就是:每一行绝对是纯横或纯竖的状态
if( (n % 2 == 0 && m % 3 == 0) || (n % 3 == 0 && m % 2 == 0) ) printf("Yes\n");//都是一样的就不用说
else if( ((n - 1) % 2 == 0 ) && (n-1)) printf("Yes\n");//有不一样的,一奇数一偶数
else if( ((m - 1) % 2 == 0 ) && (m-1)) printf("Yes\n");
else printf("No\n");
}
else printf("No\n");
}
return 0;
}
第三道codeforces题目: https://codeforces.com/problemset/problem/1925/A
这道题一点也不难,但题意真的让我这个蒟蒻搞了很长时间~
题目中一句话这么翻译: “您的任务是找出一个字符串 s,使得所有可能的长度为 n 的字符串都可以用前k个小写英文字母作为 s 的子序列出现。注: 如果从 b中删除一些字符(可能为零)而不改变其余字符的顺序即可得到 a ,则字符串 a 称为另一个字符串 b的子串。”
后面这句”用前k个小写英文字母作为s的子序列出现.”我举得Deepl翻译的有问题,所以自己看了一下英文,有个first,我认为真正的意思应该是”首,开头”的意思,而不是”前…” 翻译过来应该是k种不同开头的小写英文子序列~
欸,这真的挺伤的QWQ.英语一定好到让你有自信!!!
代码没什么说的,就是英语问题.因为太过简单,所以样例有点小小的误区.
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int t; cin >> t;
// %26 + 1;
int n,k;
char s[26];
while(t--)
{
scanf("%d%d",&n,&k);
for(int i = 0 ; i < k ; i++)
{
s[i] = 'a' + i;//元素种类
}
while(n--)
{
for(int i = 0 ; i < k ; i++)
{
printf("%c",s[i]);//元素种类
}
}
printf("\n");
}
return 0;
}