-想看题干? 传送门
- 这道题有两种做法
- 二分 (不推荐)
打了三个小时没打出来
思路如下:
先排序,然后把较小的一半先存起来,然后慢慢找(特别麻烦)。 - 贪心 (超简单)
思路是这样的。
1.读入&排序
2.用两个指针分别从数组的两头查找
3.输出
-代码 (贪心100分)
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100001],ans;
int main(){
scanf("%d %d",&m,&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
int x=1,y=n;
while(x<=y){
if(a[x]+a[y]<=m){
x++;
y--;
}
else{
y--;
}
ans++;
}
printf("%d\n",ans);
return 0;
}