Problem C Team Match

Problem C Team Match

Time Limit: 2000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 164    Accepted Submission(s): 56

 

Problem Description

The programming competition not only depends on the programmers, but also directed by the coaches. Mr Z is a coach who direct n players to take part in the Guangxi Province Collegiate Programming Contest. We assume that a team is consisted of 3 players whose ability is x, y, z respectively and x >= y >= z. Then the team’s total ability is 3 * x + 2 * y + 1 * z; And for a team, if its ability is not lower than the gold medal level m, the team will certainly win the gold medal. Mr Z would like to match teams to gain as many gold medals as possible, could you tell him how many gold medals it is?

Input

The first line is an integer T which indicates the case number.
And as for each case,  there will be 2 lines.
In the first line, there are 2 integers n m, which indicate the number of players, the gold medal level respectively. Please remember n is always the multiple of 3.
In the second line, there are n integers which represents everyone’s ability.
It is guaranteed that——
T is about 100.
for 100% cases, 1 <= n <= 15, 1 <= m <= 30, 1 <= a[i] <= 20.

Output

As for each case, you need to output a single line.
There should be an integer in the line which means the gold medal teams Mr Z could match.

扫描二维码关注公众号,回复: 2708531 查看本文章

Sample Input

2

6 18

3 3 3 4 2 2

6 7

1 1 1 1 1 1

Sample Output

2 0

Source

陈都测试1

暴力搜索,按从大到小排序,最大的配小的,搜当前最小解,

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<map>
#include<set>
#include<cmath>
#include<stack>
#define inf 0x3f3f3f3f
using namespace std;
const int mod=1e9+7;
int a[500000];
int b[500000];
bool cmp(int x,int y){
    return x>y;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        int sum=0;
        sort(a,a+n,cmp);
        for(int i=0;i<n;i++){
            int x=-1,y=-1,z=-1;
            if(b[i])continue;
            for(int j=i+1;j<n;j++){
                if(b[j])continue;
                for(int l=j+1;l<n;l++){
                    if(b[l])continue;
                    if(3*a[i]+2*a[j]+a[l]>=m){
                        x=i;
                        y=j;
                        z=l;
                    }
                }
            }
            if(x==-1)break;
            else{
                b[x]=b[y]=b[z]=1;
                sum++;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/qibage/article/details/81083993