申請SAE

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

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

2011年11月11日 星期五

[基本練習][模擬]NOIP模擬題:吉祥數 ghilie 解題報告

[問題描述]
爲了迎接聖誕,信息學興趣小組的同學在輔導老師的帶領下,舉辦了一個盛大的晚會,晚會的第一項內容是做遊戲:猜數。老師給每位同學發一張卡片,每張卡片上都有一個編號 (此編號爲非負數,且小於255),每個編號互不相同。老師制定了以下的遊戲規則:第一輪,每位同學將自己卡片上編號的各位數字進行平方後再相加得到一組新數,編號在這組新數中出現的同學淘汰出局,第二輪,餘下的同學再將編號的各位數字進行立方相加得到一組新數,編號在這組新數中出現的同學再淘汰出局,第三輪,餘下的同學再將編號的各位數字進行4次方相加得到一組新數,編號在這組新數中出現的同學再淘汰出局,……,以此類推,經過n輪後,仍留下來的同學,將獲得聖誕特別禮物,卡片上的數即爲2011年吉祥數。(假定班級人數不超過200人)
[輸入文件]
輸入文件 ghillie .in 有兩行,第1行爲1個正整數n(n<8),表示有n輪遊戲,第二行是卡片上互不相同的編號。
輸出:剩下來的各個吉祥數,按從小到大順序輸出,每兩個數之間有一個空格。
[輸出文件]
輸出文件 ghillie .out 是 1 行,爲 剩下來的各個吉祥數,按從小到大順序輸出,每兩個數之間有一個空格。
[輸入樣例]
1
24 123 2 12 20 14 4 6 36 72
[輸出樣例]
2 6 12 24 72 123
  
【分析】
 模擬即可。只要讀清題就不會錯,注意最後一個數不剩的情況。

【我的代碼】 
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int N;
int M=0;
int Time=2;
int A[201];

void init()
{
    scanf("%d\n",&N);
   
    int tmp;
    while(cin>>tmp)
    {
        A[++M]=tmp;
    }
   
    return;
}

int sq(int num)
{
    int rs=1;
    for (int i=1;i<=Time;i++)
        rs*=num;
    return rs;
}

int GetTot(int num)
{
    int rs=0;
    int tmp[100]={0};
    int top=0;
    while(num)
    {
        tmp[++top]=num%10;
        num/=10;
    }
    for (int i=1;i<=top;i++)
        rs+=sq(tmp[i]);
    return rs;
}

int cmp(const void *a,const void *b)
{
    return *((int *)a)-*((int *)b);
}

void works()
{
    int lun=0;
    while(lun<N)
    {
        int tmp[201]={0};
        for (int i=1;i<=M;i++)
        {
            if(A[i]==-1)
                tmp[i]=-1;
            else
                tmp[i]=GetTot(A[i]);
        }
       
        for (int i=1;i<=M;i++)
        {
            if(A[i]==-1)
                continue;
            for (int j=1;j<=M;j++)
            {
                if(tmp[j]==-1)
                    continue;
                if(tmp[j]==A[i])
                {
                    A[i]=-1;
                    break;
                }
            }
        }
        Time++;
        lun++;
    }   
   
    int Tmp[201]={0};
    int top=0;
    for (int i=1;i<=M;i++)
    {
        if(A[i]==-1)
            continue;
        Tmp[++top]=A[i];
    }
   
    if(top==0)
        return;
   
    qsort(Tmp+1,top,sizeof(Tmp[0]),cmp);
   
    for (int i=1;i<top;i++)
        cout<<Tmp[i]<<" ";
   
    cout<<Tmp[top]<<endl;

    return;
}

int main()
{
    freopen("ghillie.in","r",stdin);
    freopen("ghillie.out","w",stdout);
    init();
    works();
    return 0;
}

沒有留言:

張貼留言