题目简述:现在给出一群数学竞赛全体学生的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;
}
另外两题因时间和能力原因尚未完成,请谅解。