閱讀147 返回首頁    go 技術社區[雲棲]


2012年藍橋杯【初賽試題】奇怪的比賽

題目描述:

    某電視台舉辦了低碳生活大獎賽。題目的計分規則相當奇怪:

    每位選手需要回答10個問題(其編號為1到10),越後麵越有難度。答對的,當前分數翻倍;答錯了則扣掉與題號相同的分數(選手必須回答問題,不回答按錯誤處理)。

    每位選手都有一個起步的分數為10分。

    某獲勝選手最終得分剛好是100分,如果不讓你看比賽過程,你能推斷出他(她)哪個題目答對了,哪個題目答錯了嗎?

    如果把答對的記為1,答錯的記為0,則10個題目的回答情況可以用僅含有1和0的串來表示。例如:0010110011 就是可能的情況。

    你的任務是算出所有可能情況。每個答案占一行。

    答案寫在“解答.txt”中,不要寫在這裏!


思路:我覺得這一題適合用深入搜索遞歸來做,每一題隻有兩種情況,對與錯,對了,當前成績就翻倍,錯了,當前成績就減去此題的題號,然後接著向下一個題進行遞歸(繼續兩種情況並且繼續遞歸,直到到第10題回答完結束)。判定結束條件是,答完第10題後,成績剛好為100分的時候,輸出10題的對錯情況然後結束本次遞歸,成績不為100分直接結束本次遞歸。

那麼,怎麼輸出題目的對錯呢,我用的是一個結構體,有一個判定元素flag來判定此題是否對。(後來想想直接用數組存0和1也是可以的,不過結構體在其他類型的判定上也是很有用的)。

正確答案:

1011010000
0111010000
0010110011

AC代碼:

#include<stdio.h>
#include<stdlib.h>
struct node
{
  int flag; 
}a[20];
void Test(int n,int m)
{
    int i,j;
    if(n==10)
    {
        if(m==100)
        {
            for(i=1;i<=10;i++)
            printf("%d",a[i].flag);
            puts("");
            return;
        }
        else
        return;
    }
    i=n+1;
    m*=2;a[i].flag=1;
    Test(i,m);
    m/=2;
    m-=i;a[i].flag=0;
    Test(i,m);
    m+=i;
}
int main()
{
    int i,j,n,m=10;
    Test(0,10);
    system("pause");
    return 0;
}


最後更新:2017-04-03 12:55:12

  上一篇:go 2012 藍橋杯【初賽試題】微生物增殖
  下一篇:go ActionBar之style出現Cannot resolve symbol &#39;Theme&#39; 錯誤