题目 3341: 蓝桥杯2025年第十六届省赛真题-抽奖
时间限制: 2s 内存限制: 192MB 提交: 415 解决: 105
题目描述
LQ 商场为了回馈广大用户,为在此消费的用户提供了抽奖机会:抽奖机有三个转轮,每个转轮上都分布有 n 个数字图案,标号为 1 ∼ n ,按照从 1 到 n 顺序转动,当转到第 n 个图案时会从第一个继续开始。奖项如下:
1)三个相同的图案,积分 +200 ;
2)两个相同的图案,积分 +100 ;
3)三个数字图案,从左到右连续(例如 1, 2, 3 ),积分 +200 ;
4)三个数字图案,经过顺序调整后连续(例如 2, 1, 3 或 3, 2, 1 ),积分 +100 ;
抽奖机处于初始状态,三个转轮都处于第一个位置。每次开始抽奖,都会 产生三个对应的随机数 xi1, xi2, xi3 ,表示第 j 个转轮会向后转动 xi j 次停下。下 次抽奖时,转轮会从上一次转动后的位置开始继续转动。 注意,一次抽奖最多只能获得一次积分,如果同时命中多个奖项,以积分最大的那个奖项为准。
请问,如果执行 m 次抽奖,总积分值是多少?
输入格式
输入的第一行包含一个正整数 n ,表示转轮大小。
第二行包含 n 个正整数 a1, a2, · · · , an ,依次表示第一个转轮上的数字图案, 相邻整数之间使用一个空格分隔。
第三行包含 n 个正整数 b1, b2, · · · , bn ,依次表示第二个转轮上的数字图案, 相邻整数之间使用一个空格分隔。
第四行包含 n 个正整数 c1, c2, · · · , cn ,依次表示第三个转轮上的数字图案, 相邻整数之间使用一个空格分隔。
第五行包含一个整数 m ,表示抽奖次数。
接下来 m 行,每行包含三个正整数 xi1, xi2, xi3 ,相邻整数之间使用一个空格分隔。
输出格式
输出一行包含一个整数表示答案,即 m 次抽奖累计获得的积分的值。
样例输入复制
4
3 2 4 1
2 2 2 2
4 3 0 9
3
4 4 4
3 1 1
40 39 2
样例输出复制
300
提示
【样例说明】
三个转轮在初始状态下都在位置 1 。
第一次抽奖,三个转轮都转动 4 次,都转一整圈到达位置 1 ,三个转轮上 的数字图案分别是 3、2、4 ,积分 +100 ;
第二次抽奖,第一个转轮转动 3 次到达位置 4 ,第二个转轮转动 1 次到达 位置 2 ,第三个转轮转动 1 次到达位置 2 ,三个转轮上的数字图案分别是 1、 2、3 ,积分 +200 ;
第三次抽奖,第一个转轮转动 40 次到达位置 4 ,第二个转轮转动 39 次到 达位置 1 ,第三个转轮转动 2 次到达位置 4 ,三个转轮上的数字图案分别是 1、 2、9 ,积分不增加。
因此总积分为 300 。
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n ≤ 5 ,0 ≤ m ≤ 5 ;
对于 40% 的评测用例,1 ≤ n ≤ 10 ,0 ≤ m ≤ 10 ;
对于 60% 的评测用例,1 ≤ n ≤ 100 ,0 ≤ m ≤ 100 ;
对于 80% 的评测用例,1 ≤ n ≤ 200 ,0 ≤ m ≤ 200 ;
对于所有评测用例,1 ≤ n ≤ 103 ,0 ≤ m ≤ 103 ,0 ≤ ai , bi , ci ≤ 9 , 1 ≤ xi j ≤ 1000 。
1.分析
模拟即可,由于取余,可以交换a[0]和a[n]的位置。
2.代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int MAX = 1e3 + 10;
typedef long long LL;
int a[MAX], b[MAX], c[MAX],re[MAX];
int n,m, A = 1, B = 1, C = 1;
int s;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
for (int i = 1; i <= n; i++) {
cin >> c[i];
}
a[0] = a[n];
b[0] = b[n];
c[0] = c[n];
cin >> m;
while (m--) {
int x, y, z;
cin >> x >> y >> z;
A = (A + x) % (n);
re[0] = a[A];
B = (B + y) % (n);
re[1] = b[B];
C = (C + z) % (n);
re[2] = c[C];
if (re[0]==re[1]&&re[1]==re[2]) {
s += 200;
}
else if (re[0] == re[1] || re[1] == re[2] || re[0] == re[2]) {
s += 100;
}
else if (re[0] + 1 == re[1] && re[1] + 1 == re[2]) {
s += 200;
}
else {
sort(re, re + 3);
if (re[0] + 1 == re[1] && re[1] + 1 == re[2]) {
s += 100;
}
}
}
cout << s << endl;
return 0;
}