3241: 奇怪的比赛
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 14 Solved: 9
[ Submit][ Status][ Web Board]
Description
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。(将每一个答案看成二进制数,答案由大到小排列)
Input
无
Output
...
...
0010110011
HINT
Source
注:
采用递归的做法。
分数是从10开始的,每一道题目我们并不知道哪一道做的对或者错,所以我把每一道题目都置为错误的(grades[10]数组的初值均为0),text函数为递归函数(传的值分别为分数和grades数组的下标),grades数组中每一道题目又两种情况(对或者错),对的话,数组中的值就改为1,对应的分数就做加倍操作,数组下标加1(vis同时也代表当前是第几道题目);错误,就把当前数组中的值,置为0,把当前分数减去当前题目数(扣掉与题号相同的分数),题目数继续加1.
函数上方的if语句是递归出口,当成绩不满足条件或者题目数超过10个时,就继续进行下面的if语句判断(判断当前分数是否为100,如果为100,就把grades数组中的一串数字输出),否则就return 0 退出函数。
最后结果为:
1011010000
0111010000
0010110011
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int grades[10]={0};
void text(int score,int vis){
int i;
if(score<=0||vis>=11){//递归出口
if(score==100){//满足成绩为100,就输出
for(i=1;i<=10;i++){
cout<<grades[i];
}
cout<<endl;
}
return ;//不满足就退出函数
}
grades[vis]=1;//第一种情况,答对题目
text(2*score,vis+1);//成绩加倍,下标加1
grades[vis]=0;//第二种情况,答错题目
text(score-(vis),vis+1);//成绩扣掉与题号相同的分数,题目数继续加1 ;
}
int main(){
text(10,1);
return 0;
}