1621 - Jumping Around【构造】【数学】

这篇博客探讨了一种数学构造问题,涉及到利用不同跳跃长度的票(1、2、3)从0开始访问0到n的所有整数。题目保证了有解,并给出了a、b、c(3≤a,b,c≤5000且n=a+b+c)的限制条件。博主通过同余类的概念解析了解题思路,并针对不同情况讨论了如何消除c的影响。样例和代码展示了具体的解决方案。" 113965481,10541562,Python Matplotlib 横排图例与 LaTeX 标签,"['Python编程', '数据可视化', '图表', 'Matplotlib库']

题目大意

传送门

任务:从0出发,访问0~n各一次,可以在任意一点终止,需要用票才能从一个点到另一个点。
有三种票,跳跃长度分别为1 2 3,有a,b,c张(3<= a,b,c<=5000)并且n=a+b+c。
每张票只能用一次。输入保证有解。

样例

input

2
3 3 3
3 4 3

output

0 3 1 2 5 4 6 9 7 8
0 3 1 2 5 4 6 9 7 8 10

解释

思路

首先引入一个概念叫做同余类,以正整数m为模,则任何整数必然与0,1,2,3,…,m-1之一同余,将同余的数归为一类。
比如当m为4的时候。
{… -4 0 4 8 …}
{… -3 1 5 9 …}
{… -2 2 6 10 …}
{… -1 3 7 11 …}

首先考虑这样的一个问题:
如果只有一个a和n个b,然后就可以先跳2步,0 2 4 6 8,然后跳一个1,改变同余类,然后往回跳,结束。
引入了c,首先就把c消掉。
当c%3为0时,可以先往右调c/3个3,往右跳1步,往左跳c/3个3,往右跳1步,往右跳c/3个3,到达c/3*3+2的位置,这个时候c已经用完了。
c%3不为0的时候同理。

代码

#include<cstdio>
#include<map>
#include<queue>
#include<cstring>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include <math.h>
#include <stack>
using namespace std;
const int maxn = 5005;

int main()
{
    int a,b,c;
    int CaseNum;
    scanf("%d",&CaseNum);
    while(CaseNum--){
        scanf("%d%d%d",&a,&b,&c);

        int pos = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值