轮盘(模拟)

题目描述
轮盘是⼀种赌场常见的博彩游戏,⼀般会有 37 或 38 个数字,由庄家负责在转动的轮盘边打珠,然后珠子落在该格的数字就是得奖号码。
瀚瀚是⼀个可怜的小赌徒,赌输了所有的家产。这让瀚瀚重新开始思考人生,觉得为了追求刺激而赌博赌输身家不太好。因此瀚瀚发明了⼀个新的轮盘游戏,既可以跟朋友⼀起刺激的玩,还可以不用赌博。
⼀个轮盘有 N 个格子,我们顺时针地以1到 N 来编号。⼀开始轮盘游戏有两个瀚瀚的朋友分别站在两个不同格子 A 与 B 上,接着瀚瀚会发出 M 个指令,每个指令会是⼀格子编号 Xi,我们保证 Xi 不是 A 也不是 B,接着瀚瀚的两个朋友会⼀起朝着 Xi 的方向前进⼀格,其中⼀个会是逆时针方向,而另⼀个是顺时针方向,如下图所示。

在这里插入图片描述

其中 A 往 Xi 前进了⼀格,因此走到了 A′,而 B 走到了 B′。
瀚瀚保证他的朋友们都会遵守游戏规则,且过程中 A,B 不会重迭在⼀起,即 A′ 与 B′ 不会相同。

现在瀚瀚想要记录整个游戏的过程,你能否帮忙记录这两个人位置呢?

输入
第⼀行,包含四个正整数 N,M,A,B,代表轮盘有 N 个格子,瀚瀚⼀共发出了
M 个指令,⼀开始瀚瀚的两个朋友分别在编号 A,B 的格子。
接下来包含 M 行,每行⼀个正整数 Xi,代表第 i 次瀚瀚所发出的指令,测试数据保证不会有不合法的指令。
输出
对于每个指令输出两个以空白隔开的正整数,代表当前瀚瀚两个朋友的位置,其中第⼀个数字是 A 的新位置,第二个数字是 B 的新位置。

样例输入
【输入样例1】
10 5 1 2
3
4
5
6
1

【输入样例2】
4 6 1 4
2
1
2
1
2
1

样例输出
【输出样例1】
10 3
9 4
8 5
7 6
8 5

【输出样例2】
2 3
1 4
2 3
1 4
2 3
1 4

提示
【数据规模】
• 4≤ N ≤100000
• 1≤ M ≤100000
• 1≤ A,B,Xi ≤ N
• 任何时候的指令前后都满足 A ≠ B
• 任何时候的指令 Xi 都不等于 A,B

思路
直接模拟即可

代码实现

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2005;
const int M=10;
const int INF=0x3f3f3f;
const ull sed=31;
const ll mod=1e9+7;
const double eps=1e-8;
const double PI=acos(-1.0);
typedef pair<int,int>P;
 
int n,m,a,b,x;
 
int main()
{
    scanf("%d%d%d%d",&n,&m,&a,&b);
    for(int i=0;i<m;i++)
    {
        scanf("%d",&x);
        int xa=min(x+n-a,abs(x-a)),xb=min(x+n-b,abs(x-b));
        if(xa>xb)
        {
            if(x+n-b<abs(x-b))
            {
                b=(b+1)%n;
                if(b==0) b=n;
                a=(a-1+n)%n;
                if(a==0) a=n;
            }
            else
            {
                if(x>b)
                {
                    b=(b+1)%n;
                    if(b==0) b=n;
                    a=(a-1+n)%n;
                    if(a==0) a=n;
                }
                else
                {
                    b=(b-1+n)%n;
                    if(b==0) b=n;
                    a=(a+1)%n;
                    if(a==0) a=n;
                }
            }
        }
        else
        {
            if(x+n-a<abs(x-a))
            {
                a=(a+1)%n;
                if(a==0) a=n;
                b=(b-1+n)%n;
                if(b==0) b=n;
            }
            else
            {
                if(x>a)
                {
                    a=(a+1)%n;
                    if(a==0) a=n;
                    b=(b-1+n)%n;
                    if(b==0) b=n;
                }
                else
                {
                    a=(a-1+n)%n;
                    if(a==0) a=n;
                    b=(b+1)%n;
                    if(b==0) b=n;
                }
            }
        }
        printf("%d %d\n",a,b);
    }
    return 0;
}
发布了235 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43935894/article/details/104187526