数袋鼠好有趣

来源:互联网 发布:阿里移动推荐算法总结 编辑:程序博客网 时间:2024/05/01 15:09

这个题目需要将袋鼠按照体型从大到小排序之后,将前一半体型较大的与后面一半体型较小的比较,如果前者是后者体型的两倍(或更大)就将袋鼠的数目减一,最后输出剩余袋鼠数量

这时我用的几组测试数据:

6

9 8 6 4 3 1 输出 3

5

9 4 1 1 1 输出3

有n只袋鼠。每只袋鼠的大小用一个整数表示。一只小袋鼠能装进一只大袋鼠的条件是,大袋鼠的大小至少是小袋鼠的两倍。

每只大袋鼠最多可以装一只袋鼠。小袋鼠被装进大袋鼠之后就不能再装其它的袋鼠了。

小袋鼠被装进大袋鼠之后就不能被我们看见了。请找出一个装袋鼠的方案,使得被看见的袋鼠最少。


Input
单组测试数据。 
第一行包含一个整数n(1≤n≤5*10^5)。 
接下来n行,每行一个整数si,表示第i只袋鼠的大小 (1≤si≤10^5)。
Output
输出一个整数,即最少能看见的袋鼠数量。
Sample Input
825769842
Sample Output
5
队列实现:

#include<stdio.h>#include<queue>#include<algorithm>using namespace std;bool cmp(int a,int b){return a>b;}int reco[500005]={0};int main(){int n,num,i,cnt=0;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&reco[i]);}sort(reco+1,reco+n+1,cmp);queue<int> q_max,q_min;if(n&1)num=n+1;elsenum=n;for(i=1;i<=num/2;i++)q_max.push(reco[i]);for(;i<=n;i++)q_min.push(reco[i]);while(1){while(q_max.front()>=2*q_min.front()){cnt++;q_max.pop();q_min.pop();if(q_max.empty()||q_min.empty())break;}if(q_max.empty()||q_min.empty())break;while(q_max.front()<2*q_min.front()){cnt++;q_min.pop();if(q_max.empty()||q_min.empty())break;}if(q_max.empty()||q_min.empty())break;}printf("%d",q_max.size()+q_min.size()+cnt);return 0;}
数组实现:

#include<stdio.h>#include<stdlib.h>#include<queue>#include<algorithm>using namespace std;bool cmp(int a,int b){return a>b;}int reco[500005]={0};int main(){int n,num,i,j,ans;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&reco[i]);}    sort(reco+1,reco+n+1,cmp);    num=n,ans=n;    if(num&1)        num++;    for(i=num/2+1,j=1;j<=num/2&&i<=n;i++)    {        if(reco[j]>=2*reco[i])        {            j++;            ans--;        }    }    printf("%d",ans);return 0;}