Description
有 n n 个题目,每个题目有个正确答案和 bi b i 个错误答案,每个题目只能选择一个答案,有 m m 个学生会从这个题目中选择一个子集来做,使得他们中存在一个人可以做对该子集所有题目,问所选子集规模的最大值
Input
第一行一整数 T T 表示用例组数,每组用例手续爱你输入两个整数表示题目数量和学生数量,之后 n n 行每行输入两个整数表示第 i i 个题目正确答案数量和错误答案数量
Output
输出可选子集的最大规模
Sample Input
2
3 5
1 3
1 3
1 3
5 50
1 1
1 3
1 2
1 3
1 5
Sample Output
1
3
Solution
一个题目至少需要 bi+1 b i + 1 个人才能试出正确答案,故将所有问题按 bi b i 升序排,找最大的 i i 使得即为答案,注意若 b1+1>m b 1 + 1 > m 则答案为 0 0 <script type="math/tex" id="MathJax-Element-180">0</script>
Code
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int T,n,m,b[105];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int temp;
scanf("%d%d",&temp,&b[i]);
b[i]++;
}
sort(b+1,b+n+1);
int ans;
for(int i=1,j=1;i<=n;i++)
{
if(j<=m/b[i])
{
j*=b[i];
if(i==n)ans=n;
}
else
{
ans=i-1;
break;
}
}
printf("%d\n",ans);
}
return 0;
}