题面
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。
每位选手都有一个起步的分数为10分。
某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?
如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。
题解
枚举,回溯
枚举每道题答对还是答错的两种状态,并记录下其状态,到最后判断总分若满足要求,输出状态即可。
答案:
1011010000
0111010000
0010110011
代码
#include<iostream>
#include<string>
using namespace std;
string state;
void dfs(int k, int s) { //k表示第 k + 1题,s 表示当前总分
if (k == 10) {
if (s == 100) cout << state << endl;
return;
}
//答对
state.push_back('1');
dfs(k + 1, s * 2);
state.pop_back();
//答错
state.push_back('0');
dfs(k + 1, s - k - 1);
state.pop_back();
}
int main() {
dfs(0, 10);
return 0;
}
标题: | 2012年第三届蓝桥杯省赛-D.奇怪的比赛 |
---|---|
链接: | https://www.fightingok.cn/detail/155 |
更新: | 2022-09-18 22:43:40 |
版权: | 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可 |