编程题#5:细菌实验分组
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
有一种细菌分为A、B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱。在一次为时一个 小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组。
输入
输入有多行,第一行为整数n(n≤100),表示有n个培养皿。
其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。
输出
输出有多行:
第一行输出A亚种培养皿的数量,其后每行输出A亚种培养皿的编号,按繁殖率升序排列。
然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。
样例输入
样例输出
提示
亚种内部细菌繁殖能力差异 远远小于 亚种之间细菌繁殖能力差异。
也就是说,亚种间任何两组细菌的繁殖率之差都比亚种内部两组细菌的繁殖率之差大。
这题的关键点:通过按序排列后,相邻差值的最大值来作为区分类别的标志。
代码:
//编程题#5:细菌实验分组
//逻辑:将各个繁殖率按升序排列,求出各相邻繁殖率之间的差值,最大差值即为区分A类和B类的分界线。
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
double idRate[100] = { 0 }; //按id存储繁殖率
int idOrder[100] = { 0 };//记录id的顺序
for (int i = 0; i < n; i++)
{
double id,numStart, numFinal ;
cin >> id >> numStart >> numFinal;
idOrder[i] = id;
idRate[i] = double(numFinal /numStart);
}
//对繁殖率按升序排列
//使得数组idRate和数组idOrder一一对应。
for (int i = 0; i < n-1; i++)
for (int j = i + 1; j < n;j++)
{
if (idRate[i] > idRate[j])
{
int changeRate = 0;
changeRate = idRate[i];
idRate[i] = idRate[j];
idRate[j] = changeRate;
int changeId = 0;
changeId = idOrder[i];
idOrder[i] = idOrder[j];
idOrder[j] = changeId;
}
}
//求相邻两繁殖率的差值,找出最大差值,取出其位置
int maxDifference = 0;
int flagSplit = 0;
for (int i = 0; i < n-1; i++)
{
int difference = idRate[i + 1] - idRate[i];
if (difference > maxDifference)
{
maxDifference = difference;
flagSplit = i;
}
}
//flagSplit位置及之前的为B类,之后的为A类
//输出A类
cout << n - (flagSplit+1) << endl;
for (int i = flagSplit + 1; i < n; i++)
{
cout << idOrder[i] << endl;
}
//输出B类
cout << flagSplit + 1 << endl;
for (int i = 0; i <= flagSplit; i++)
{
cout << idOrder[i] << endl;
}
return 0;
}