zoukankan      html  css  js  c++  java
  • 删除元素(二分查找)

    原题链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=776

    删除元素

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:2
     
    描述

    题意很简单,给一个长度为n的序列,问至少删除序列中多少个数,使得删除后的序列中的最大值<= 2*最小值

    输入
    多组测试数据,每组测试数据包含两行。
    第一行一个整数n( n <= 10^5),序列中元素的个数。
    第二行依次输入n个数a1,a2……an,(1 <= ai <= 10^9)以空格分开。
    输出
    输出占一行,至少要删除数的个数。
    样例输入
    6
    5 4 3 3 8 6
    样例输出
    1
    运行AC截图:

    代码如下:
     1 #include<iostream>
     2 #include<algorithm>   //sort(a,a+n)对数组a进行升序 
     3 #include<cmath>        //main(a,b) 
     4 int a[100005];
     5 using namespace std;
     6 int main(){
     7     int n;
     8     while(cin>>n){
     9         for(int i=0;i<n;i++)
    10             cin>>a[i];
    11         sort(a,a+n);
    12         int ans=n,p=0;
    13         for(int i=0;i<n;i++){
    14             while(p<n&&a[p]<=a[i]*2)
    15                 p++;
    16             ans=min(ans,n+i-p);
    17         }
    18         cout<<ans<<endl;
    19     }
    20     return 0;
    21 }

    实现:先对n个数从小到大排序,然后枚举删除一些元素后剩余集合中最小的数Min,二分求出原集合大于2*Min的数的个数,然后即可求的当前要删除的元素个数,比较取最优的即可。

  • 相关阅读:
    [hdu1402]A * B Problem Plus(NTT)
    拦截导弹问题(Noip1999)
    删数问题(Noip1994)
    1217:棋盘问题
    随笔功能测试
    教师派8
    教师派7
    教师派6
    教师派5
    教室派4
  • 原文地址:https://www.cnblogs.com/geziyu/p/9195720.html
Copyright © 2011-2022 走看看