目录
试题A:美丽的2(5分)
【问题描述】
小蓝特别喜欢 2, 今年是公元 2020 年, 他特别高兴。
他很好奇, 在公元 1 年到公元 2020 年(包含)中, 有多少个年份的数位中包含数字 2?
【答案提交】
这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
题解
答案:563
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 1e9;
const int maxn = 1e5;
int cnt;
bool have2(int x){
while(x != 0){
if(x % 10 == 2){
return true;
}
x /= 10;
}
return false;
}
int main(){
int x;
for(int i = 1; i <= 2020; i++){
if(have2(i)){
cnt++;
}
}
cout << cnt;
return 0;
}
试题B:扩散(5分)
【问题描述】
小 蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图, 每个格子可以用一个二维的整数坐标表示。小蓝在画布上首先点了一下几个点: (0, 0), (2020, 11), (11, 14), (2000,2000)。
只有这几个格子上有黑色, 其它位置都是白色的。
每过一分钟, 黑色就会扩散一点。具体的, 如果一个格子里面是黑色, 它就会扩散到上、下、左、右四个相邻的格子中, 使得这四个格子也变成黑色
(如果原来就是黑色, 则 还是黑色)。
请问, 经过 2020 分钟后, 画布上有多少个格子是黑色的。
【答案提交】
这是一道结果填空的题, 你 只 需要算出结果后提交即可。本题的结果为一个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
题解
答案: 20312088
- 做法:BFS
- 坑点:标记访问的时机,一定要在入列前标记访问,才能保证每个点不在后面重复访问,这样1~2秒就能运行出结果,否则运行时间爆炸式增长。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 1e9;
const int maxn = 1e4;
const int SHIFT = 2020; //为了使用vis数组. 设置一个偏移量使得坐标非负
struct e{
int x, y, step;
}nds[maxn];
int dir[4][2] = {
{
-1, 0}, {
0, -1}, {
1, 0}, {
0, 1}};
bool vis[maxn][maxn];
int cnt;
int main(){
nds[0] = e{
0, 0, 0}, nds[1] = e{
2020, 11, 0}, nds[2] = {
11, 14, 0}, nds[3] = e{
2000, 2000, 0};
for(int i = 0; i < 4; i++){
nds[i].x += SHIFT;
nds[i].y += SHIFT;
cout << nds[i].x << " " << nds[i].y << endl;
}
queue<e> q;
q.push(nds[0]);
q.push(nds[1]);
q.push(nds[2]);
q.push(nds[3]);
while(!q.empty()){
e now = q.front(); q.pop();
// printf("x = %d, y = %d, step = %d\n", now.x, now.y, now.step);
if(now.step == 2021){