您的位置:首页 > 其它

细菌实验分组(C程序设计进阶第2周)

2015-11-09 14:02 351 查看
问题描述

有一种细菌分为A、B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱。在一次为时一个 小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组。

输入

输入有多行,第一行为整数n(n≤100),表示有n个培养皿。

其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。

输出

输出有多行:

第一行输出A亚种培养皿的数量,其后每行输出A亚种培养皿的编号,按繁殖率升序排列。

然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。

样例输入

5
1 10 3456
2 10 5644
3 10 4566
4 20 234
5 20 232


样例输出

3
1
3
2
2
5
4


提示

亚种内部,细菌繁殖能力差异远远小于亚种之间细菌繁殖能力的差异。

也就是说,亚种间任何两组细菌的繁殖率之差都比亚种内部两组细菌的繁殖率之差大。

源码

#include <iostream>
#include <vector>
using namespace std;

int main()
{
//输入部分
int n = 0;
cin >> n;
vector<float> rate(n);
vector<int> id(n);
for (int i = 0; i < n; i++)
{
int first = 0, last = 0;
cin >> id[i] >> first >> last;
rate[id[i]-1] = (float)last/first;
}

//繁殖率升序排序
for (int i = 0; i < n-1; i++)
{
for (int j = i+1; j < n; j++)
{
if (rate[id[i]-1] > rate[id[j]-1])
{
int temp = id[i];
id[i] = id[j];
id[j] = temp;
}
}
}

int maxDifference = 0;
int flagSplit = 0;
for (int i = 0; i < n-1; i++)
{
if (maxDifference < rate[id[i+1]-1]-rate[id[i]-1])
{
maxDifference = rate[id[i+1]-1]-rate[id[i]-1];
flagSplit = i;
}
}

//输出
cout << n-flagSplit-1 << endl;
for (int i = flagSplit+1; i < n; i++)
{
cout << id[i] << endl;
}
cout << flagSplit+1 << endl;
for (int i = 0; i < flagSplit+1; i++)
{
cout << id[i] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: