天天看點

NBUT 1450 Blitzcrank

  • [1450] Blitzcrank

  • 時間限制: 1000 ms 記憶體限制: 65535 K
  • 問題描述
  • NBUT 1450 Blitzcrank

    Blitzcrank  is a robot.

    There are some pretty good registers(寄存器) in Blitzcrank's body.

    There are some instructions about register A and register B:

    1.ADD A, B means a += b. The machine code is 80 AF BF.

    2.ADD A, A means a += a. The machine code is F0 AF.

    3.ADD B, B means b += b. The machine code is F0 BF.

    4.ADD B, A means b += a. The machine code is 80 BF AF.

    Now give you the values in register A and register B and some machine codes. You should calculate out the final value in register A and register B after operating the machine code.

  • 輸入
  • The frist line contains an integer T, means there are T test cases.

    For each test case, the first line contains two integers means the initial value of the register A and the register B in hexadecimal(十六進制).

    The next line contains a series of hexadecimal numbers.

  • 輸出
  • For each test case, print the register A and register B's value in hexadecimal.
  • 樣例輸入
  • 2
    A1 B2
    80 AF BF F0 AF
    B2 B3
    F0 AF F0 BF      
  • 樣例輸出
  • 2A6 B2
    164 166
          
  • 提示
  • The first case's machine codes 80 AF BF F0 AF is composed of ADD A, B and ADD A, A.      
  • 來源
  • Monkeyde17      

    這題目其實挺水的,我寫着題的目的主要是想分享一下剛學到的超神string和stringstream的用法。 詳細介紹請看:http://blog.csdn.net/zhang_xueping/article/details/47846807

    這題目是說給出兩個十六進制的數A和B,通過輸入特定字元串進行操作,同樣用十六進制輸出操作後的A和B。 具體操作為:

    1.當輸入“80 AF BF”時,a += b;

    2.當輸入“F0 AF”時,a += a.

    3.當輸入“F0 BF”時,b += b. 

    4.當輸入“80 BF AF”時,b += a. 

    這題主要就是考察字元串的處理。用普通的方法可以很快敲出來:

    #include<cstring>
    #include<cstdio>
    #include<cmath>
    const int mx=1e6+10;
    char s[mx];
    int a,b,l;
    
    int main() {
        int t;
        scanf("%d",&t);
        while(t--) {
            scanf("%X %X",&a,&b);
            getchar();
            gets(s);        //由于操作次數不确定,是以用scanf難以控制,則用gets比較友善
            l=strlen(s);
            int i=0;
            while(i<l)
            {
                if(s[i]=='8')
                {
                    if(s[i+3]=='A' )
                        a+=b;
                    else if(s[i+3]=='B')
                        b+=a;
                    i+=9;
                }
                else if(s[i]=='F')
                {
                    if(s[i+3]=='A')
                        a+=a;
                    else if(s[i+3]=='B')
                        b+=b;
                    i+=6;
                }
            }
            printf("%X %X\n",a,b);      //此處的%x和%X要區分開,用大寫輸出的字母就是大寫,用小寫就輸出小寫字母
        }
        return 0;
    }
               
    不過這個代碼不是我要展示的重點,我覺得特别神奇的是string
    /*
    Author:ZXPxx
    Memory: 268 KB		Time: 343 MS
    Language: G++		Result: Accepted
    */
    
    #include<cstring>
    #include<iostream>
    #include<sstream>
    #include<cstdio>
    using namespace std;
    stringstream sbuf;
    int main() {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int A,B;
            string str,op,a,b;
            cin>>hex>>A>>B;
            sbuf.clear();
            cin.ignore();
            getline(cin,str);
            sbuf<<str;
            while(sbuf>>op)
            {
                if(op=="80")
                {
                    sbuf>>a>>b;
                    if(a=="AF")
                        A+=B;
                    else
                        B+=A;
                }
                else
                {
                    sbuf>>a;
                    if(a=="AF")
                        A+=A;
                    else
                        B+=B;
                }
            }
            printf("%X %X\n",A,B);
        }
        return 0;
    }
               
    就像處理整形資料一樣,好友善啊……