编程题#5:细菌实验分组

描述

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

 

输入

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

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

 

输出

输出有多行:

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

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

#include <iostream>
using namespace std;
void asc(int id[],double rate[],int n);
int maxdiff(double rate[],int n);
int main() {
    int n,a, index, inital,final;
    int id[100];
    double rate[100];
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a >> inital >> final;
        id[i] = a;
        rate[i] = 1.0 * final / inital;
    }
    asc(id,rate,n);//调用升序排列函数
    index = maxdiff(rate,n); //调用最大差函数,返回最大差前者数组下标
    cout << n - index - 1 << endl; 
    for (int i = index + 1; i < n; i++) {
        cout << id[i] << endl;
    }
    cout << index + 1 << endl;
    for (int i = 0; i <= index; i++)
        cout << id[i] << endl; 
    return 0;
} 
void asc(int id[],double rate[],int n) {
    for (int i = 0; i < n - 1; i++)
        for ( int j = 0; j < n - i - 1; j++) {
            if (rate[j + 1] < rate[j]) {
                int temid = id[j + 1];
                id[j + 1] = id[j];
                id[j] = temid;
                double temrate = rate[j + 1];
                rate[j + 1] = rate[j];
                rate[j] = temrate;
            }
        }
}
int maxdiff(double rate[],int n) {
    int max = 0,j;
    for (int i = 0; i <= n - 2; i++) {
        if (rate[i+1] - rate[i] > max) {
            max = rate[i+1] - rate[i];
            j = i;
        }
    }
    return j;
}

 

posted on 2017-10-26 13:13  平行线不会相交  阅读(588)  评论(0)    收藏  举报

导航