题目链接:Nothing is Impossible
题意
一个班上有 m m 个学生参加考试,试卷上总共有 道题,每道题有 ai a i 个正确选项和 bi b i 个错误选项,每个学生每道题只能从 ai+bi a i + b i 个选项中选择一个选项作为答案,每个学生都不知道正确答案,但是这个教室内的学生在考试期间可以相互讨论,且他们十分团结,他们想让班上的最高分的做对的题数最多,问他们在采取最优策略下,能够做对的最多的题数。
输入
第一行为一个整数 T (1≤T≤100) T ( 1 ≤ T ≤ 100 ) ,接下去有 T T 组数据,每组数据第一行为两个整数 ,接下去 n n 行每行两个整数 。
输出
输出最高分能够做对的最多的题数。
样例
输入 |
---|
2 3 5 1 3 1 3 1 3 5 50 1 1 1 3 1 2 1 3 1 5 |
输出 |
1 3 |
题解
个人认为这题应该加一个“最高分至少能够做对的题数”,即在他们所有人运气都最坏的情况下,能够做对的题数的最大值,最优策略就是让所有人的答案填法按照 bi b i 进制一个一个地填上去,如果能够达到第 i i 位,则说明第 位以下的所有情况都已经填上去,也就至少能够保证做对 i−1 i − 1 道题,为了让位数增长最快,应该让 bi b i 值小的作为低位。
过题代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <sstream>
using namespace std;
#define LL long long
const int maxn = 100 + 100;
struct Node {
int a, b;
};
bool operator<(const Node &a, const Node &b) {
return a.b < b.b;
}
int T, n, m, ans;
Node node[maxn];
int num[maxn];
int main() {
#ifdef Dmaxiya
freopen("test.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif // Dmaxiya
ios::sync_with_stdio(false);
scanf("%d", &T);
while(T--) {
ans = 0;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i) {
scanf("%d%d", &node[i].a, &node[i].b);
}
sort(node, node + n);
for(int i = 0; i < n; ++i) {
if(m > node[i].b) {
++ans;
}
m /= (node[i].b + 1);
}
printf("%d\n", ans);
}
return 0;
}