卡片
【问题描述】
小蓝有很多数字卡片,每张卡片上都是一个数字(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();
}
|