赞
踩
小蓝正在参与一个现场问答的节目。
活动中一共有 30 道题目,每题只有答对和答错两种情况,每答对一题得 10 分,答错一题分数归零。
小蓝可以在任意时刻结束答题并获得目前分数对应的奖项,之后不能再答任何题目。
最高奖项需要 100 分,所以到达 100 分时小蓝会直接停止答题。
已知小蓝最终实际获得了 70 分对应的奖项,请问小蓝所有可能的答题情况有多少种?
本题的结果为一个整数,在提交答案时只输出这个整数,输出多余的内容将无法得分。
根据题目可知,在题目数≥8题时,最后8题一定是【×+8√】,只需考虑除最后8题前面题目的作答情况。
考虑一维动态规划,f[i]定义为i个题时,小蓝获得70分的答题情况的种类数,状态转移过程可以表示为,从i-1道题到i道题过程中,最前面的题作答是√还是×,若不考虑任何条件,则f[i]=2f[i-1],即每多一道题,前面的题可以是两种情况,相乘即可。
初始状态:f[7]=1(全对),f[8]=1,考虑到100分会直接停止,在i=8到17的过程中,除最后8题,前面的题不可能出现得100分的情况,故f[i]=2f[i-1]。
i=18时,若最前面的题为√,则会出现100分的情况,故f[18]=2*f[17]-1
i=19时,i=18包含【9√+x+x+9√】的情况,此时若最前面的题为√,则会直接停止,f[19]=2*f[18]-1
考虑前面9题均为√的情况,可以推得i=19到i=28时,状态转移方程为f[i]=2f[i-1]-2^(i-19)
i=29,需考虑i=28时存在【9√+x+10√+×+9√】情况,同理i=30需考虑i=29的特殊情况。
最后将f[7]~f[30]进行相加得到答案:8335366
- #include<bits/stdc++.h>
- using namespace std;
- int main() {
- vector<int> f(31, 0);
- f[7] = 1;
- f[8] = 1;
- for (int i = 9; i < 18; i++)
- f[i] = 2 * f[i - 1];
- f[18] = 2 * f[17] - 1;
- int t = 1;
- for (int i = 19; i <= 28; i++)
- {
- f[i] = 2 * f[i - 1]-t;
- t *= 2;
- }
- f[29] = 2 * f[28] - (t - 1);
- t *= 2;
- f[30] = 2 * f[29] - (t - 3);
- int sum = 0;
- for (int i = 7; i <= 30; i++) {
- sum += f[i];
- }
- cout << sum;
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。