低碳生活大賽(奇怪的比賽)---藍橋杯
阿新 • • 發佈:2018-12-14
題目:某電視臺舉辦了低碳生活大獎賽。題目的計分規則相當奇怪: 每位選手需要回答10個問題(其編號為1到10),越後面越有難度。答對的,當前分數翻倍;答錯了則扣掉與題號相同的分數(選手必須回答問題,不回答按錯誤處理)。每位選手都有一個起步的分數為10分。 某獲勝選手最終得分剛好是100分,如果不讓你看比賽過程,你能推斷出他(她)哪個題目答對了,哪個題目答錯了嗎?如果把答對的記為1,答錯的記為0,則10個題目的回答情況可以用僅含有1和0的串來表示。例如:0010110011 就是可能的情況。你的任務是算出所有可能情況。每個答案佔一行。
1.遞迴解法
#include<stdio.h> int ans[12]; void dfs(int sum,int u) { int i; if(u == 11) { if(sum == 100) { for(i = 1; i < 11 ;i ++) { printf("%d",ans[i]); } puts(""); } } else { ans[u]=0; dfs(sum-u,u+1); ans[u]=1; dfs(sum*2,u+1); } } int main() { dfs(10,1); return 0; }
2.暴力破解解法
#include<stdio.h> int main() { int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10; int a[10], i, j, count = 10, sum = 0; for(x1 = 0; x1 <= 1; x1 ++) { a[0] = x1; for(x2 = 0; x2 <= 1; x2 ++) { a[1] = x2; for(x3 = 0; x3 <= 1; x3 ++) { a[2] = x3; for(x4 = 0; x4 <= 1; x4 ++) { a[3] = x4; for(x5 = 0; x5 <= 1; x5 ++) { a[4] = x5; for(x6 = 0; x6 <= 1; x6 ++) { a[5] = x6; for(x7 = 0; x7 <= 1; x7 ++) { a[6] = x7; for(x8 = 0; x8 <= 1; x8 ++) { a[7] = x8; for(x9 = 0; x9 <= 1; x9 ++) { a[8] = x9; for(x10 = 0; x10 <= 1; x10 ++) { a[9] = x10; for(i = 0; i < 10; i ++) { if(a[i] == 0) { count = count - (i + 1); } if(a[i] == 1) { count *= 2; } if(count == 100 && i == 9) { sum ++; for(j = 0; j < 10; j ++) printf("%d ",a[j]); printf("\n"); } } count = 10; } } } } } } } } } } printf("%d\n",sum); return 0; }