B-Mentai Cosmic_牛客练习赛98 (nowcoder.com)
题意:
思路:
贪心
一开始极端化地想,能不能把所有数都选上?
然后发现不满足条件:对于选中的任意两个数,两两之和必须大于等于m
然后去考虑勉强满足这个条件:让最小值和次小值之和大于等于m
那么我们就可以考虑遍历所有组合的最小值和次小值,看看让最小值和次小值之和大于等于m的最小的最小值和次小值
因此考虑sort一下,观察相邻两个数,这样遍历的相邻的两个数就是遍历的最小值和次小值
Code:
#include <bits/stdc++.h>
const int mxn=1e6+10;
int a[mxn];
using namespace std;
int main(){
int t,n,m,cnt=0;
scanf("%d",&t);
while(t--){
cnt=0;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",a+i);
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(a[i]>=m) cnt++;
else{
if(a[i]+a[i+1]>=m) cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}
总结:
1.贪心先极端化地想,然后看没满足什么条件,然后考虑恰好满足这个条件