申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/

2011年11月13日 星期日

USACO 2011 November Contest, Bronze Division Problem 2. Awkward Digits (digits)

Problem 2: Awkward Digits [Brian Dean]
Bessie the cow is just learning how to convert numbers between different bases, but she keeps making errors since she cannot easily hold a pen between her two front hooves.

Whenever Bessie converts a number to a new base and writes down the result, she always writes one of the digits wrong. For example, if she converts the number 14 into binary (i.e., base 2), the correct result should be "1110", but she might instead write down "0110" or "1111". Bessie never accidentally adds or deletes digits, so she might write down a number with a leading digit of "0" if this is the digit she gets wrong. 

Given Bessie's output when converting a number N into base 2 and base 3, please determine the correct original value of N (in base 10). You can assume N is at most 1 billion, and that there is a unique solution for N.

Please feel welcome to consult any on-line reference you wish regarding base-2 and base-3 numbers, if these concepts are new to you. 

PROBLEM NAME: digits 

INPUT FORMAT: * Line 1: The base-2 representation of N, with one digit written incorrectly. * Line 2: The base-3 representation of N, with one digit written incorrectly.

SAMPLE INPUT (file digits.in): 
1010
212 

INPUT DETAILS: When Bessie incorrectly converts N into base 2, she writes down "1010". When she incorrectly converts N into base 3, she writes down "212". 

OUTPUT FORMAT: * Line 1: The correct value of N. SAMPLE OUTPUT (file digits.out): 14 

OUTPUT DETAILS: The correct value of N is 14 ("1110" in base 2, "112" in base 3).

【分析】
暴力枚舉 二進制表示的每一位,然後轉換為10進制,再轉換成3進制,如果與給的3進制數只有1位相同,輸出這個數的10進制即可。

【我的代碼(成績出來了,滿分)
/*
ID:zyfwork1
PROB:digits
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int binary[100];
int nilen;
int san[100];
int sanlen;
int Tmp[100];
int tmplen;
int tmp[100];

int sq(int n,int base)
{
    int rs=1;
    for (int i=1;i<=base;i++)
        rs*=n;
    return rs;
}

int convert(int base,int len)
{
    int rs=0;
    int tl=len;
    len--;
    for (int i=1;i<=tl;i++)
    {
        rs+=tmp[i]*sq(2,len);
        len--;
    }
    return rs;
}

void init()
{
    char str[100];
    memset(str,'\0',sizeof(str));
    scanf("%s\n",&str);
    nilen=strlen(str);
    for (int i=1;i<=nilen;i++)
        binary[i]=str[i-1]-'0';
   
    memset(str,'\0',sizeof(str));
    scanf("%s\n",&str);
    sanlen=strlen(str);
    for (int i=1;i<=sanlen;i++)
        san[i]=str[i-1]-'0';
}

void Con(long long num)
{
    int Temp[100];
    memset(Temp,0,sizeof(Temp));
    int p=0;
    while(num)
    {
        Temp[++p]=num%3;
        num/=3;
    }
    tmplen=p;
    for (int i=1;i<=p;i++)
        Tmp[p-i+1]=Temp[i];
    return;
}

int main()
{
    freopen("digits.in","r",stdin);
    freopen("digits.out","w",stdout);
    init();
    for (int i=1;i<=nilen;i++)
    {
        memset(tmp,0,sizeof(tmp));
        for (int j=1;j<=nilen;j++)
            tmp[j]=binary[j];
        tmp[i]=!tmp[i];
        long long ten=convert(2,nilen);
        Con(ten);
       
        int error=0;
        if(sanlen!=tmplen)
            continue;
        for (int i=1;i<=sanlen;i++)
            if(Tmp[i]!=san[i])
                error++;
        if(error==1)
        {
            cout<<ten<<endl;
            break;
        }           
    }
    return 0;
}

沒有留言:

張貼留言