本文主要是介绍数袋鼠好有趣,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这个题目需要将袋鼠按照体型从大到小排序之后,将前一半体型较大的与后面一半体型较小的比较,如果前者是后者体型的两倍(或更大)就将袋鼠的数目减一,最后输出剩余袋鼠数量
这时我用的几组测试数据:
6
9 8 6 4 3 1 输出 3
5
9 4 1 1 1 输出3
有n只袋鼠。每只袋鼠的大小用一个整数表示。一只小袋鼠能装进一只大袋鼠的条件是,大袋鼠的大小至少是小袋鼠的两倍。
每只大袋鼠最多可以装一只袋鼠。小袋鼠被装进大袋鼠之后就不能再装其它的袋鼠了。
小袋鼠被装进大袋鼠之后就不能被我们看见了。请找出一个装袋鼠的方案,使得被看见的袋鼠最少。
第一行包含一个整数n(1≤n≤5*10^5)。
接下来n行,每行一个整数si,表示第i只袋鼠的大小 (1≤si≤10^5)。
8 2 5 7 6 9 8 4 2
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;
}
这篇关于数袋鼠好有趣的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!