• 【CF373C】计算袋鼠是愉快的(Counting Kangaroos is Fun)-贪心


    Problem 计算袋鼠是愉快的

    题目大意

    有n只袋鼠,如果一个袋鼠体积是另一个袋鼠的两倍或以上,则小袋鼠能被大袋鼠装进袋子里,装进去后就看不到袋子里的袋鼠了,问这群袋鼠如何行动才能使得它们看着数量最少,请输出该数量。(注意,如果一个小袋鼠被装在袋子里,则小袋鼠袋子里不能再嵌套袋鼠了)

    也就是给出一个数组,求这个数组中最多的u,v使得u>=2v,每个数组中的数只能作为一次u,v

    (具体还是直接看题吧)

    Solution

    首先我们考虑最优情况,一定有:最小ans≥n/2,这是题目限制条件可得的。

    所以,首先我们先将这个数组排序。

    易得,大袋鼠取越大一定是越优的。所以最小ans情况下,我们的大袋鼠一定是取 值最大 的ans个数。

    且我们通过排序性质可得,被装进袋子里的袋鼠一定是取位置≤n/2的数,因为这里的数一定比后面的要小,所以更优。

    所以我们将这个数组切成两部分,以n/2为界限。枚举前半段,从n/2->1,若能放进目前最大可放的袋鼠就放进去。

    这样所得的答案是最优答案,代码也超级短。贪心果然是好的。

    AC Code

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 using namespace std;
     5 int n,a[500010];
     6 int main(){
     7     scanf("%d",&n);
     8     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
     9     sort(a+1,a+n+1);
    10     int ans=n;
    11     for(int i=n>>1;i>0;i--)
    12         if(a[ans]>=(a[i]<<1))ans--;
    13     printf("%d
    ",ans);
    14 }
  • 相关阅读:
    Javaweb 第4 天xml 课程
    Javaweb 第2天 JavaScript课程
    Javaweb 第1天 HTML和CSS课程
    第27天反射(解剖)技术
    Ip 讲解
    第26 天网络编程
    第25天多线程、网络编程
    【剑指offer】连续子数组的最大和,C++实现
    [剑指offer]数组中最小的K个数,C++实现
    【剑指offer】数组中出现次数超过数组长度一半的数字,C++实现
  • 原文地址:https://www.cnblogs.com/skylynf/p/7158644.html
Copyright © 2020-2023  润新知