高级思维

 杭电5670Machine
  • 1
  • 2

有一个机器,它有 m (2\leq m\leq 30)m(2≤m≤30) 个彩灯和一个按钮。每按下按钮时,最右边的彩灯会发生一次变换。变换为:

  1. 如果当前状态为红色,它将变成绿色;

2.如果当前状态为绿色,它将变成蓝色;

3.如果当前状态为蓝色,它将变成红色,并且它左边的彩灯(如果存在)也会发生一次变换。

初始状态下所有的灯都是红色的。 
询问按下按钮 n (1\leq n< {2}^{63})n(1≤n<2 
​63 
​​ ) 次以后各个彩灯的颜色。 
输入描述 
输入包含多组数据. 第一行有一个整数T (1\leq T\leq 15)T(1≤T≤15), 表示测试数据的组数. 对于每组数据: 
唯一的一行包含2个整数 m (2\leq m\leq 30)m(2≤m≤30) 和 n (1\leq n< {2}^{63})n(1≤n<2 
​63 
​​ ) 。 
输出描述 
对于每组数据,输出一个长度为mm的字符串,表示从左到右mm个彩灯的颜色。 
R代表红色;G代表绿色;B代表蓝色。 
输入样例 

3 1 
2 3 
输出样例 
RRG 
GR

我只想说被坑了。一道水题然而被题目坑了,可能也是自己想多了。题目的左边,一直以为是他的左边所有的灯,然而真正的意图是左边的一个。知道题目意思了后,其实是一道水题了,一下子就可以找到规律吧。

初始化R==0;G==1;B==2; 
第m个灯的状态就是三次一循环,则可以是n%3; 
第m-1个灯的状态就是n%3^2%3^2====n/3,之后再%3; 
之后的就可以变成了一个循环。

for(i = m; i >= 1; i--){
            a[i] = n%3; 
            n = n/3;
        }
  • 1
  • 2
  • 3
  • 4

然而发这个博客的主要原因不是这个。而是听了别人说这题的做法后,发现思维真的很奇特,要学习学习所以发这篇博客,还是先看看他们的方法把。转化为3进制,刚开始听到3进制的时候,顿时间超无语的,怎么与三进制有关啊。我也是顿时进无语了了。后来听了解释之后,顿时间惊呆了,这跟我那找规律完全不是一个档次哒。

转化为3进制,其实前面已经有点矛头了,初始化R==0;G==1;B==2; 
0,1,2不就是3进制的基数吗?并且他那种变化,不知道你们注意没,是不是进位,对的,就是进位。是不是很简单了。 
无语了,

    for(i = 1; i <= n; i++){
            a[m]++;
            a[m] = a[m]%3;
            l = a[m];
            while(l == 0){
                a[m-1] = a[m-1]+1;
                a[m-1] = a[m-1]%3; 
                l = a[m-1];
            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然而只是超时代码,突然间还是没有转过来啊。其实这个答案就是n转化为3进制的结果,还注意一下那个最后还要取摸一下就OK了。 
码上学姐的代码,真心不想打了。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
char s[]={'R','G','B'};
int main()
{
    long long int m,n,x,y;
    int i,t;
    cin>>t; 
    while(t--)
    {
        char b[100];
        cin>>m>>n;
        int rel = 0;
        int mul = 1;
        for(i=1;i<=m;i++){
            mul*=3;
        }
        n %= mul;
        while(n)
        {
            y = n%3;
            b[rel++] = s[y];
            n /= 3;
        }      
        for(i=1;i<=m-rel;i++)
            cout<<"R";
        for(i=rel-1;i>=0;i--)
            cout<<b[i];
        cout<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值