Problem D. Nothing is Impossible HDU - 6335(思维)

Problem D. Nothing is Impossible HDU - 6335

m students, including Kazari, will take an exam tomorrow.
The paper consists of exactly n problems, the i-th problem contains ai correct answers and bi incorrect answers, i.e. the i-th problem contains ai+bi candidates in total.
Each student should choose exactly one candidate as answer for each problem. If the answer to a certain problem is correct, then the student will get one point. The student who gets the most points wins.
Students only know the structure of the paper, but they are able to talk with each other during the exam. They decide to choose a subset S of all n problems, and they will only be able to submit answers on these problems.
They want to know the maximum size of S that the winner among them will solve all the problems in S if they take the optimal strategy.

For sample 1, students can choose S={1},and we need at least 4 students to guarantee the winner solve the only problem.

For sample 2, students can choose S={1,2,3}, and we need at least 24 students to guarantee the winner solve these three problems, but if |S|=4, we need at least 96 students, which is more than 50
.
Input
The first line of the input contains an integer T (1≤T≤100) denoting the number of test cases.
Each test case starts with two integers n,m (1≤n≤100,1≤m≤109), denoting the number of problems and the number of students. Each of next n lines contains two integers ai,bi ( 1≤bi≤100,ai=1), indicating the number of correct answers and the number of incorrect answers of the i
-th problem.
Output
For each test case, print an integer denoting the maximum size of S
.
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

题意:

给定n个题目,每个题目1个正确选项b个错误的,让我们选择一个子集S使得有人可以将这S个题全做对

分析:

每个题目做对的概率是 1 1 + b 1 ,所以如果保证有人做对这么一道题目,至少需要 1 + b 1 个人,即每人选一个答案,那么一定有个人可以选对,同理如果想再做对一道题,那么都做对的概率变成了 1 ( 1 + b 1 ) ( 1 + b 2 ) ,这样就需要 ( 1 + b 1 ) ( 1 + b 2 ) 个人才能保证有人两个全做对,因此我们将每个题所有选项数目存起来,排个序,每次相乘,得到前缀积,比较人数即可,当大于了人数m就退出循环,这样就求得了最大题目数量

code:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,m;
        scanf("%d%d",&n,&m);
        int arr[110];
        for(int i = 0; i < n; i++){
            int a,b;
            scanf("%d%d",&a,&b);
            arr[i] = a + b;
        }
        sort(arr,arr+n);
        long long sum = 1;
        int i;
        for(i = 0; i < n; i++){
            sum *= arr[i];
            if(sum > m) break;
        }
        printf("%d\n",i);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/codeswarrior/article/details/81352912