Problem C Team Match
Time Limit: 2000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 160 Accepted Submission(s): 55
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.
Sample Input
2
6 18
3 3 3 4 2 2
6 7
1 1 1 1 1 1
Sample Output
2
0
解题思路:从小到大排序后,每次选择一个最小,一个最大,然后中间 a[i](i 从小到大)循环寻找合适的中间数。在还没整个数组统计完时,如果当中有一次 return false,那么就肯定有一对已经没法执行,那么选择最小的尽量靠前的3个淘汰掉,再整个重来。
AC 代码
/
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a); #define INF 0x3f3f3f3f using namespace std; typedef long long ll; int n,m,a[20]; bool solve(int x) { int l=(n/3-x)*3+1, r=n, vis[20]; mem(vis,0); while(l<r) { int flag=0; for(int i=l+1;i<r;i++) { if(!vis[i] && 3*a[r]+2*a[i]+a[l]>=m) { flag=1; vis[i]=1; break; } } if(!flag) return false; vis[l]=vis[r]=1; while(vis[l]) l++; while(vis[r]) r--; } return true; } int main() { int T; scanf("%d",&T); while(T-- && ~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); int ans=n/3; while(ans) { if(solve(ans)) break; else ans--; } printf("%d\n",ans); } return 0; }