LQ_奇怪的比赛



奇怪的比赛

简述

这是2012年蓝桥杯全国软件大赛预赛(C++本科组)的第4题,情景是一个计分规则奇怪的比赛,问题是已知总分得到每题的回答情况。

题目描述

    某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
    每位选手需要回答10个问题(其编号为110),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
    每位选手都有一个起步的分数为10分。
    某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
    如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有10的串来表示。例如:0010110011 就是可能的情况。
    你的任务是算出所有可能情况。每个答案占一行。
    答案写在解答.txt”中,不要写在这里!

 解法一:递归

#include<cstdio>

#include<cstring>

using namespace std;

int a[11];

void dfs(int i,int sum)

{

if(i>10){    //sum>=100不一定要退出 

if(i==11 && sum==100){ //注意要在i>10的时候再统计 

for(int j=1;j<=10;j++)printf("%d",a[j]);

printf("\n");

}

return ;

}

a[i]=0;

dfs(i+1,sum-i);

a[i]=1;

dfs(i+1,sum*2);

}

int main()

{

dfs(1,10);

return 0;

}

 

 

 解法二:递归

#include <iostream>

using namespace std;

bool b[11];

void f(int n)

{

  if(n==11){

    int sum=10;

    for(int j=1;j<=10;j++){

      if(b[j]==0)sum=sum-j;

      else sum=sum*2;        

    }

    if(sum==100){

      for(int i=1;i<=10;i++)printf("%d",b[i]);

      printf("\n");            

    } 

return;      

  }

  b[n]=0;//假设该题答错 

  f(n+1); //继续答后续题目 

  b[n]=1;//假设该题答错 

  f(n+1);   //继续答后续题目 

}

 

int main()

{

  f(1);

  return 0;    

 

 

解法三:

枚举0到1023

 

#include<stdio.h>

#include<math.h>

#include<string.h>

int a[10];

void find(int x)

{

int m=0;

while(x){

a[m++]=x%2;

x /= 2;

}

}

int main()

{

int i,j;

memset(a,0,sizeof(a));

for(i=0;i<1024;){

int n=10;

for(j=0;j<10;j++){

if(a[j]==0)n=n-j-1;

else n=2*n;

}

if(n==100){

for(j=0;j<10;j++)printf("%d",a[j]);

printf("\n");

}

find(i++);

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值