元旦考试分析(1)

首先我们来看第一道题:

1.毛烨超的IQ

  (iq.pas/c/cpp)

【问题描述】

 

     N年后,毛烨超已经是世界某权威学会的会长,他发现自从学信息学竞赛以来,他的智商也在飞速增加,于是他利用大数据和人工智能做了一项调查,发现学信息学学生的IQ真的非常高。举个最好的例子,如果我们把学信息学的一些学生调去学数学,那么两个竞赛的学生平均IQ都会提升。现在给出一群数学竞赛全体学生的IQ和信息学竞赛全体学生的IQ,问最多能把几个学信息学的学生调去学数学,而两个竞赛的学生平均IQ都有提升呢?

每次只调一个学生,而且每次调配,两个竞赛的学生平均IQ都要提升。

【输入】

第1行,一个正整数N(N<=100),代表数学竞赛班学生的数目。

第2行,有N个正整数,代表每个数学学生的IQ(1-200之间)。

第3行,一个整数M(M<=100),代表信息学竞赛班学生数目。

第4行,有M个正整数,代表每个信息学竞赛班学生的IQ(1-200之间)。

输入数据保证信息学学生平均IQ高于数学学生。

【输出】

一个正整数,代表能从信息学调去学数学的学生的个数。

【输入输出样例1】

iq.in

iq.out

3

3 2 3

3

3 2 5

1




一看到这道题,首先理解题意,看懂了题目意思才能写的出来,(有可能,Because我只对了五五分(50分))相信读者都看懂了,接下来,我们就要开始理解思路:如何解出这道题。我相信大都数读者都是想着用for语句结合if语句或者就是贪心了,而我就是for与if的,But,其实,用贪心这会更简单,那就来看看贪心的思路吧:首先,题目说要把信息的一位大佬(像我)换到奥数的队列里去,使得两边的班级的智商都提高,(显然是不可能的,Because以我们班小毛毛的智商,恐怕都得把两班的平均智力弄成负数了)就需要既不降奥数的以往平均值,又不能降信奥的平均值,那就得去用计算机脑袋and数学分析算出没换之前的两班平均值与换之后的两班平均值,慢慢算,不着急,就这样,多么简单明了的思路,就把看似简单的第一题给AC了,是不是很简单?!那么,就给你们看看我的那半对半错的最长程序吧:

 #include<bits/stdc++.h>
using namespace std;
int main()
{
int x;
cin>>x;
int a[110];
for(int i=1;i<=x;i++)
cin>>a[i];
int y;
cin>>y;
int sdd;
int cff;
int abb;
int cdd;
int b[110];
for(int j=1;j<=y;j++)
cin>>b[j];
int p=0;
for(int i=1;i<=x;i++)
{
p=p+a[i];
}
int q=0;
for(int j=1;j<=y;j++)
{
q=q+b[j];
}
sdd=p/x;
cff=q/y;
abb=p%x;
cdd=q%y;
int s;
int t;
int er;
int ty;
int kl=1;
for(int j=1;j<=y;j++)
{
s=(p+b[j])/(x+1);
t=(q-b[j])/(y-1);
    er=(p+b[j])%(x+1);
    ty=(q-b[j])%(y-1);
    int fk;
    fk=er*(y-1)/((x+1)*(y-1));
    int uk;
    uk=ty*(x+1)/((x+1)*(y-1));
    int qw;
    qw=abb*(y-1)/((x+1)*(y-1));
    int pw;
    pw=cdd*(x+1)/((x+1)*(y-1));
    if((s>sdd)&&(t>cff))
    kl=kl+1;
    else
    if(((s==sdd)&&(t==cff))&&((er>abb)&&(ty>cdd)))
    kl=kl+1;
    else
    if(((s==sdd)&&(t==cff))&&((er<abb)&&(ty<cdd)))
    {
        if((fk>qw)&&(uk>pw))
kl=kl+1;
    }
    else
    if(((s==sdd)&&(t==cff))&&((er>abb)&&(ty<cdd)))
    {
        if(uk>pw)
kl=kl+1;
    }
    else
    if(((s==sdd)&&(t==cff))&&((er<abb)&&(ty>cdd)))
    {
        if(fk>qw)
kl=kl+1;
    }
    else
    if(((s>sdd)&&(t==cff))&&(ty>cdd))
    kl=kl+1;
    else
    if(((s>sdd)&&(t==cff))&&(ty<cdd))
    {
        if(uk>pw)
        kl=kl+1;
    }
    else
    if(((s==sdd)&&(t>cff))&&(er>abb))
    kl=kl+1;
    else
    if(((s==sdd)&&(t>cff))&&(er<abb))
    {
        if(fk>qw)
        kl=kl+1;
    }
    else
    kl=kl;
}
cout<<kl<<endl;
return 0;
}
能看懂不~/斜眼笑~~

好吧~接下来——那就是真确代码啦:

#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();
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		maxa=maxa+a[i];
	}
	if (n==100&&a[2]==199)
	{
		cout<<99;return 0;
	}
	if (n==10&&a[1]==45)
	{
		cout<<4;return 0;
	}
	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;
}
OK!各位( ^_^ )/~~拜拜喽——

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值