蓝桥杯模拟

卡片

【问题描述】

小蓝有很多数字卡片,每张卡片上都是一个数字(0 到 9)。
小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起
来,卡片就不能用来拼其他数了。
小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼
11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到
多少?

思路

可以看出第一个花完的数字是1,所以所以我们只需要暴力模拟,将每个的数的每一位数对十取模得到每位数,然后是1就减,见到1的牌数为0。但是需要注意的是最终的结果需要减1,因为在我的代码中加多了一次因为最后判定的一次。

代码

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
42
43
44
45
46
47
48
49
50
51
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

constexpr int N = 1e5+10;

int cnt = 2021;



void solve(){

for(int i = 1;;i++){

int b = i;

while(b){

int t = b%10;

if(t==1){

if(cnt==0){

cout<<i-1<<' ';

return;

}

else cnt--;

}

b/=10;

}

}

}

int main(){

ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

solve();

}

赢球票

【问题描述】

某机构举办球票大奖赛。获奖选手有机会赢得若干张球票。
主持人拿出 N 张卡片(上面写着 1, . . . , N 的数字),打乱顺序,排成一个圆圈。
你可以从任意一张卡片开始顺时针数数: 1, 2, 3 . . .
如果数到的数字刚好和卡片上的数字相同,则把该卡片收入囊中,从下一张卡片重
新数数。
直到再无法收获任何卡片,游戏结束。囊中卡片数字的和就是赢得球票的张数。
比如卡片排列是 1 2 3,我们从 1 号卡开始数,就把 1 号卡拿走。再从 2 号卡开始,
但数的数字无法与卡片对上,很快数字越来越大,不可能再拿走卡片了。因此这次我们
只赢得了 1 张球票。
还不算太坏!如果我们开始就傻傻地从 2 或 3 号卡片数起,那就一张卡片都拿不
到了。
如果运气好,卡片排列是 2 1 3,那我们可以顺利拿到所有的卡片!
本题目标:已知顺时针卡片序列,随便你从哪里开始数,求最多能赢多少张球票(就
是收入囊中的卡片数字之和)。

【输入格式】

第一行一个整数 N (N ⩽ 100),表示卡片数目。
第二行 N 个整数,表示顺时针排列的卡片。

【输出格式】

输出一行,一个整数,表示最好情况下能赢得多少张球票。

【样例输入】

3
1 2 3

【样例输出】

1

题目分析

就是会成一个环,如果没有找到对应的数字,就往下走,并且数到的数字加1,如果还没有就继续重复操作,直到数到的数字大于卡片里的最大值,但是如果找到对应的卡片后,数到的数字就归1,重新开始循环。所以结束的要求是:成功的是全部都找到,失败就是数到的数字大过卡牌的数字,这两种情况都会导致程序结束。
题目还有要求是找到最优情况,所以暴力模拟的话就是通过对卡片每一个位置开始数,找到能拿到最多牌的情况。

代码

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

constexpr int N = 110;

int a[N];

void solve(){

int n;

cin>>n;

int ans = 0;

for(int i = 1;i<=n;i++) cin>>a[i];

for(int i = 1;i<=n;i++){//模拟全部情况

int num = 1;

int pos = i;

int res = 0;

int flag[N] = {0};

int count = 0;

while(1){

//全部取走或者函数

if(count==n||num>n) break;

//卡片被取走

if(flag[pos]){

pos++;

if(pos==n+1) pos=1;//也就是循环到开头

}

//取走卡片

else{

if(a[pos]==num){

res+=a[pos];

flag[pos]=1;

count++;

num=1;

pos++;

if(pos==n+1) pos = 1;

}

else{

num++;

pos++;

if(pos==n+1) pos = 1;

}

}

}

if(res>ans) ans = res;//找到最优解

}

cout<<ans<<endl;

return;

}

int main(){

ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

solve();

}

蓝桥杯模拟
https://ljw030710.github.io/2024/01/25/蓝桥杯模拟/
Author
iolzyy
Posted on
January 25, 2024
Licensed under