IQ(贪心)

题目描述
根据世界某权威学会的一项调查,学信息学的学生IQ非常高。举个最好的例子,如果我们把学信息学的一些学生调去学数学,那么两个竞赛的学生平均IQ都会提升!!
现在给出一群数学竞赛全体学生的IQ和信息学竞赛全体学生的IQ,问最多能把几个学信息学的学生调去学数学,而两个竞赛的学生平均IQ都有提升呢?
每次只调一个学生,而且每次调配,两个竞赛的学生平均IQ都要提升。
输入
第1行一个正整数N(N≤I00),代表数学竞赛班学生的数目;
第2行,有N个正整数,代表每个数学学生的IQ(1到200之间);
第3行,一个整数M(M≤100),代表信息学竞赛班学生数目;
第4行,有M个正整数,代表每个信息学竞赛班学生的IQ(1到200之间)。
输入数据保证信息学学生平均IQ高于数学学生。
输出
一个正整数,代表能从信息学调去学数学的学生的个数。
样例输入
3
3 2 3
3
3 2 5
样例输出
1
这题有许多坑,是个贪心的题目,这考ACMer的思维能力

#include <stdio.h>
#include <algorithm>
using namespace std;
int main ()
{
    int a[10000];
    int b[10000];
    int n,m,i,j,sa=0,sb=0,t=0;
    int z,num=0;
    double aver1,aver2,a1,a2;
    scanf ("%d",&n);
    for (i=1; i<=n; i++)
    {
        scanf ("%d",&a[i]);//数学
        sa+=a[i];
    }
    scanf ("%d",&m);
    z=m;
    for (i=1; i<=m; i++)
    {
        scanf ("%d",&b[i]);//信息学
        sb+=b[i];
    }
    sort(b,b+m);
    aver1=(double)sa/n;
    aver2=(double)sb/m;
    while(1)//反复遍历,直到找不到这个数为止
    {
        num=0;
        for (i=1; i<=z; i++)
        {
            if ((double)(sa+b[i])/(n+1)>aver1&&(double)(sb-b[i])/(m-1)>aver2)//条件
            {
                ++t;
                aver1=(double)(sa+b[i])/(n+1);
                aver2=(double)(sb-b[i])/(m-1);
                sa+=b[i];
                sb-=b[i];
                n++;
                m--;
                b[i]=-1;
                sort(b,b+m);
                continue;
            }
            num++;
        }
        if(num==z)
            break;
    }
    printf ("%d",t);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值