EOJ Monthly 2020.7 B. 线上考试(排列组合)

Cuber QQ 迎来了他在华师大的最后一次期末考试。由于情况特殊,这场考试改为线上进行。

这是为毕业班特别准备的一次期末考试,命题老师为了让各位考生顺利毕业,设计了如下考试规则:

期末考试试卷共 n (1≤n≤1000)道选择题,由单选题和多选题组成。每道题的选项个数可能不同,多选题保证至少有一个正确选项。考试允许多次提交(每次提交会提交整张试卷而不是某一道题),每次提交之后都会反馈每一道题是对是错(多选题当且仅当考生答案和标准答案完全一致时反馈”正确”)。

当然,命题老师也不会任由考生们躺着通过,因此他足足出了一千道题目!

Cuber QQ 这下彻底慌了,他想设计一个自动答题脚本,但是在开工前,他想请你帮忙完成一些准备工作。Cuber QQ 会给出所有题的题型和选项个数,请你求出,在最优策略下,至多多少次提交可以做对所有题。

输入格式

第一行输入一个整数 n (1≤n≤1000),表示题目个数。

接下来 n 行,每行包含一个字符 c (S 或者 M,S 表示该题为单选题,M 表示该题为多选题)和一个正整数 x (1≤x≤10),分别表示各题的题型和选项个数。

输出格式

输出一个正整数,表示在最优策略下,至多多少次提交可以做对所有题。

样例

Input

2 S 5 M 2

Output

5

输出试的次数最多的一个题的次数即可,因为同时也可以把其他题试出来。对于单选题的次数是x,多选题的话由排列组合知识可得为C(x, 1) + C(x, 2) + C(x, 3) +……C(x, x)=2 ^ x – 1,取最大即可。

#include <bits/stdc++.h>
using namespace std;
int fpow(int a, int b)
{
    int ans = 1;
    for(; b; b >>= 1)
    {
        if(b & 1) ans = ans * a;
        a= a * a;
    }
    return ans;
}
int main()
{
    int n;
    cin >> n;
    getchar();
    int ans = 1;
    for(int i = 1; i <= n; i++)
    {
        char c;
        int x;
        scanf("%c%d",&c, &x);
        getchar();
        if(c == 'S') ans = max(ans, x);
        else
        {
            ans = max(ans, fpow(2, x - 1));;
        }
    }
    cout << ans;
    return 0;
}
原文地址:https://www.cnblogs.com/lipoicyclic/p/13334803.html