http://acm.ocrosoft.com/problem.php?cid=1316&pid=4
题目描述
根据世界某权威学会的一项调查,学信息学的学生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
代码:
#include <bits/stdc++.h>
using namespace std;
int a[10000];
int b[10000];
int main () {
int n, m;
int sa = 0, sb = 0, t = 0;
int num=0;
double aver1, aver2, a1, a2;
scanf ("%d", &n);
for(int i = 1; i <= n; i ++) {
scanf ("%d", &a[i]);
sa += a[i];
}
scanf("%d", &m);
int z = m;
for(int 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(int 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;
}