高級思維

 杭電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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章