轻重搭配|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)


样例输入:
6
1 9 7 3 5 5
样例输出:
4

思路:贪心,选错贪心思路,只能过一小部分数据,正确贪心思路:从前一半遍历,在后一半中找到比当前元素的两倍大的数(因为这里指针不会后移,所以可以采用双指针)

代码:

#include<bits/stdc++.h>
using namespace std;
int arr[500005];
int n;

int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		scanf("%d",&arr[i]);
	}
	sort(arr,arr+n);
	int q = n/2;
	int ans = n;
	//贪心: 使用双指针 在后半段数组中查找比a[p]大两倍的第一个元素 并且指针q是一直增加的 
	for(int p=0;p<n/2;p++){
		while(q < n && arr[q] < arr[p]*2) q++;
		if(q == n) break;
		ans--;
		q++;
	}
	printf("%d\n",ans);
	return 0;
} 
posted @ 2019-02-01 15:12  fishers  阅读(799)  评论(0编辑  收藏  举报