描述

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

输入

输入有多行,第一行为整数n(n≤100),表示有n个培养皿。
其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。

输出

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

提示

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

思考总结

在输出AB组时,需要根据之前排序的方式进行相对应调整。

 

#include<iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    // 思路1:先分组,再排序输出但分组的依据不能准确定义;
    // 思路2:可以先考虑整体排序,然后落差最大的位置作为AB组的区分;
    int id[100];
    double rate[100];
    // 一个用来存id,一个用计算速率
    for (int i = 0; i < n; i++) {
        int initial, final;
        cin >> id[i] >> initial >> final;
        rate[i] = (double)final / initial;
    }
    // 先进行整体的排序
    // 所采用的是“冒泡排序”
    // 这里是升序排列,那么就逐次将最大值移动到最后
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (rate[j] > rate[j + 1]) {
                int tempId = id[j];
                id[j] = id[j + 1];
                id[j + 1] = tempId;
                double tempRate = rate[j];
                rate[j] = rate[j + 1];
                rate[j + 1] = tempRate;
            }
        }
    }
    // 找出落差值最大的位置
    double maxDiff = 0.0;
    int indexDiff;
    for (int i = 0; i < n - 1; i++) {
        double tempDiff = rate[i + 1] - rate[i];
        if (maxDiff < tempDiff) {
            maxDiff = tempDiff;
            indexDiff = i;//记录的是最后一个较小值
        }
    }
    //输出A组,繁殖速率大的
    cout << n - indexDiff - 1 << endl;
    for (int i = indexDiff + 1; i < n; i++) {
        cout << id[i] << endl;
    }
    //输出B组
    cout << indexDiff + 1 << endl;
    for (int i = 0; i < indexDiff + 1; i++) {
        cout << id[i] << endl;
    }

    return 0;
}