测试题解(不知道几)

题目简述:现在给出一群数学竞赛全体学生的IQ和信息学竞赛全体学生的IQ,问最多能把几个学信息学的学生调去学数学,而两个竞赛的学生平均IQ都有提升呢?思路:能被调走的一定是IQ大于数学组的平均IQ而小于信息组的平均IQ,由此,这个过程可以有递归实现。代码实现:

#include<bits/stdc++.h>

using namespace std;

int a[100]={},b[100]={},n,s,m,y=1;double maxa=0,maxb=0;

void work()

{

int k=0,x=0; for(int i=1;i<=m;i++)

if((maxb>b[i])&&(maxa<b[i])){k=1,x=i;break;}

if(k!=1) return;s=s+1;//跳出递归;

maxa=(maxa*double(n)+b[x])/(double(n+1)*1.0);n=n+1;

maxb=(maxb*double(m-y+1)-b[x])/(double(m-y)*1.0);y=y+1;//修改平均值;

a[n]=b[x];b[x]=-1;//移动;

work();

}i

nt main(){

cin>>n;

for(int i=1;i<=n;i++)

{

cin>>a[i];

maxa=maxa+a[i];

}//读入;

cin>>m;

for(int i=1;i<=m;i++)

{

cin>>b[i];

maxb=maxb+b[i];

}

maxa=maxa/(n*1.0);maxb=maxb/(m*1.0);//平均值计算;

work();

cout<<s;//输出;

return 0;

}

题目简述:

需要的木头的总需要量为M。 现在需要确定一个最大的统一的砍树高度H,如果某棵树的高度大于H,则高出的部分被砍下。使得所有被砍下的木材长度之和达到M(允许稍超过M)。 

思路: 利用桶排储存,将数据逐次递加或递减来搜寻高度H;

代码实现:

#include<bits/stdc++.h>
using namespace std;
long long h=0,maxx=0,x,y,s=0;
int n,m,a[100000001];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)

  cin>>x;
  maxx=max(maxx,x);
  a[x]++;
    }//桶排读入;
    for(s=maxx;h<m;s--)
    {
    y+=a[s];
    h=h+y;
    }//递减寻找;
    cout<<s;
    return 0;
}

另外两题因时间和能力原因尚未完成,请谅解。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值