超级幸运球100X 题解
原题链接:1064.超级幸运球100X2023-10-16 13:28:15
发布于:天津
一道小模拟题,考察细心度,平时做做模拟题有利于身心健康
正文开始
说白了就是宾果游戏,bingo没玩过井字棋总玩过吧,只不过是 的棋盘,正着横着斜着满五个格子连成线,线越多奖金越多
他会给出每张彩票填的数字,最中间的那个是通配符,相当于本身已经选中了。
然后会公布 个中奖数字,最后一个是超级幸运球,如果他参与组成一条线,则奖金再翻一个倍数。
我用一个桶来记录彩票,里面实际存储的是那个数字所在彩票的位置,他的下标是彩票上的数字
中奖数字最后才会公布,所以要存储所有的彩票信息
代表第i张彩票的数字 所在的位置,如果是 代表这张彩票没选这个数字
(当然你可以用 map,但这里彩票数字范围很小,用桶足够了)
检查彩票时,对照中奖数字,将彩票数组的信息转到另一个桶 q ,桶 q 的下标对应彩票数字位置,存储的是这个位置是否被选中(“”或“”)
有 种连线方法,横着 种,竖着 种,斜着 种。检查每一种情况,如果五个数同时都被选中,则计数器 ,同时再把这五个数存到另一个桶 k
你会发现存到桶 k 的数字都是参与连线的数字,这样就可以检查是否触发超级幸运数,使奖金翻倍了
AC代码
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
const int N=1003,inf=2147483647;
int n,h,x,cnt,ans;
int a[N][54]; //彩票
int q[54],k[54];//q存中奖选中的数字所在的位置,k存参与连线的数字所在的位置,体现在下标
int f[23]; //存中奖数字
int m[8]={0,1,5,50,250,1000,10000};//奖金
int main(){
scanf("%d",&n);
for(int t=1;t<=n;t++){
for(int i=1;i<=25;i++){
if(i==13)continue;//中间的是通配符,不输入
scanf("%d",&x);
a[t][x]=i;
}
}
for(int i=1;i<=20;i++)scanf("%d",&f[i]);
scanf("%d",&h);//超级幸运中奖倍率
for(int t=1;t<=n;t++){
memset(q,0,sizeof q);
memset(k,0,sizeof k);//清空
q[13]=1;//通配符相当于选中
for(int i=1;i<=20;i++){
if(a[t][f[i]]){//如果不是0
q[a[t][f[i]]]=1;//投入桶中
}
}//按顺序检查中奖数字在彩票上的位置
cnt=0;
for(int i=0;i<5;i++){
int y=i*5;
if(q[y+1]&q[y+2]&q[y+3]&q[y+4]&q[y+5]){
cnt++;
k[y+1]=k[y+2]=k[y+3]=k[y+4]=k[y+5]=1;
}
}//检查横排
for(int i=1;i<=5;i++){
if(q[i]&q[i+5]&q[i+10]&q[i+15]&q[i+20]){
cnt++;
k[i]=k[i+5]=k[i+10]=k[i+15]=k[i+20]=1;
}
}//检查竖排
if(q[1]&q[7]&q[13]&q[19]&q[25]){
cnt++;
k[1]=k[7]=k[13]=k[19]=k[25]=1;
}
if(q[5]&q[9]&q[13]&q[17]&q[21]){
cnt++;
k[5]=k[9]=k[13]=k[17]=k[21]=1;
}//检查对角线
cnt=cnt>6?6:cnt;//超过六条线的奖金与六条线相同
ans=m[cnt];
if(k[a[t][f[20]]])ans*=h;
printf("%d\n",ans);
}
return 0;
}
感谢支持,如题解有错请提出
全部评论 4
张五666
2024-07-27 来自 浙江
0你上社区规范了)
2024-07-24 来自 广东
0建议加上 LaTeX 和数字或字母与中文之间要有空格,不然看着很难受
2023-09-29 来自 四川
0OK,已更改
2023-10-16 来自 天津
0
感谢题解,后续还有一堆改编自c****o的模拟题
2023-01-28 来自 浙江
0
有帮助,赞一个