第二届蓝桥杯省赛---奇怪的比赛
奇怪的比赛
-
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
答案写在“解答.txt”中,不要写在这里!
分析:
方法一:直接暴力即可,十层for循环,按照规则进行相应的运算。。。
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int mark; 6 int a[10]; 7 for(a[1]=0; a[1]<=1; a[1]++) 8 for(a[2]=0; a[2]<=1; a[2]++) 9 for(a[3]=0; a[3]<=1; a[3]++) 10 for(a[4]=0; a[4]<=1; a[4]++) 11 for(a[5]=0; a[5]<=1; a[5]++) 12 for(a[6]=0; a[6]<=1; a[6]++) 13 for(a[7]=0; a[7]<=1; a[7]++) 14 for(a[8]=0; a[8]<=1; a[8]++) 15 for(a[9]=0; a[9]<=1; a[9]++) 16 for(a[10]=0; a[10]<=1; a[10]++) 17 { 18 mark=10; 19 for(int i=1; i<=10; i++) 20 { 21 if(a[i]==0) 22 mark-=i; 23 else 24 mark*=2; 25 } 26 if(mark==100) 27 { 28 for(int i=1; i<=10; i++) 29 cout<<a[i]; 30 cout<<endl; 31 } 32 } 33 return 0; 34 }
方法二:深搜每种状态,每种问题有两种情况,(1正确,0错误),时间度咋读是2^10......
1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int maxn = 15; 7 8 void dfs(int k, int score,int a[] ){ 9 if(k==11){/*符合要求的话*/ 10 if(score==100){ 11 /*这里不能写成if(k==11&&score==100),想一想为什么???*/ 12 for( int i=1; i<=10; i++ ){ 13 cout<<a[i]; 14 } 15 cout<<endl; 16 } 17 return ; 18 } 19 a[k]=1; 20 dfs(k+1,abs(score)*2,a); 21 22 a[k]=0; 23 dfs(k+1,score-k,a); 24 /*a[k]=0;*/ 25 26 } 27 28 int main(){ 29 int a[maxn]; 30 /*for( int i=1; i<=10; i++ ){ 31 a[i]=0; 32 }*/ 33 memset(a,0,sizeof(a)); 34 dfs(1,10,a);/*第一个参数代表第几个问题,第二个参数代表现在的得分*/ 35 return 0; 36 }
有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!