3241: 奇怪的比赛

3241: 奇怪的比赛

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 14  Solved: 9
[ Submit][ Status][ Web Board]

Description

某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:

   
每位选手需要回答10个问题(其编号为110),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。

   
每位选手都有一个起步的分数为10分。

   
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?

   
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有10的串来表示。例如: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;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值