IQ(贪心)

xiaoxiao2021-02-28  128

题目描述 根据世界某权威学会的一项调查,学信息学的学生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; }
转载请注明原文地址: https://www.6miu.com/read-29006.html

最新回复(0)