第十四届蓝桥杯大赛软件赛省赛

C/C++ 大学 B 组

试题A日期统计

题目

题目链接

image-20230411085046212

1
2
3
5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2
7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1
0 0 9 4 8 0 9 1 2 8 5 0 2 5 3 3

答案:235

思路

考场思路:

暴力2023xxxx约是O(1008)?铁T,根本跑不完。

又因为2023不变,所以先找到2023(眼看,第58个是3,前面出现了202子序列),再对后面遍历所有子序列情况,存到map里。O(414)

最后遍历所有日期,map出现过就res++。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<bits/stdc++.h>
using namespace std;
int a[100];
map<int,int> mp;
int res = 0;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main()
{
freopen("A.txt","r", stdin);
for(int i = 1; i <= 41; i ++)
{
cin >> a[i];
}
for(int i1 = 1; i1 <= 41; i1 ++)
{
for(int i2 = i1 + 1; i2 <= 41; i2 ++)
{
for(int i3 = i2 + 1; i3 <= 41; i3 ++)
{
for(int i4 = i3 + 1; i4 <= 41; i4 ++)
{
int num = a[i1] * 1000 + a[i2] * 100 + a[i3] * 10 + a[i4];
mp[num] = 1;
}
}
}
}
for(int i = 1; i <= 12; i ++)
{
for(int j = 1; j <= days[i]; j ++)
{
if(mp[100 * i + j] == 1)res ++;
}
}
cout << res;
return 0;
}

可能正解:

对所有天数判断。O(365*100)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<bits/stdc++.h>
using namespace std;
int a[1000];
int res = 0;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(string s)
{
int num = 1;
for(int i = 1; i <= 100; i ++)
{
// 转成string才能比较
string d = to_string(a[i]);
if(s[num] == d[0])num ++;
if(num > 8)return 1;
}
return 0;
}

int main()
{
// freopen("A2.txt","r", stdin);
for(int i = 1; i <= 100; i ++)
{
cin >> a[i];
}
for(int i = 1; i <= 12; i ++)
{
for(int j = 1; j <= days[i]; j ++)
{
// i,j用string存才不乱码
string s = "02023";
if(i < 10)s += "0";
s += to_string(i);
if(j < 10)s += "0";
s += to_string(j);
if(check(s))res ++;
}
}
cout << res;
return 0;
}

试题 B: 01 串的熵

题目

题目链接

image-20230411094436776

思路

考场思路:

看不懂,心态崩了不想写。

填个114514得了。

可能正解:暴力