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; }
分类:
数学—计数原理与排列组合
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!