[PAT] Grado 1016 facturas de teléfono (25 puntos)

Ejemplo de entrada:
10 10 10 10 10 10 20 20 20 15 15 15 15 15 15 15 20 30 20 15 15 10 10 10
10
Cyll 01: 01: 06: 01 en línea
Cyll 01: 28: 16: 05 off-line
CYJJ 01: 01: 07: 00 fuera de línea
Cyll 01: 01: 08: 03 fuera de línea
CYJJ 01: 01: 05: 59 en línea
aaa 01: 01: 01: 03 en línea
aaa 01:02:00 : 01 en línea
Cyll 01: 28: 15: 41 en línea
aaa 01: 05: 02: 24 en línea
aaa 01: 04: 23: 59 off-line

Salida de muestra:
CYJJ 01
01:05:59 01:07:00 61 $ 12,10
Cantidad total: $ 12,10
Cyll 01
01:06:01 01:08:03 122 $ 24,40
28:15:41 28:16:05 24 $ 3,85
Cantidad total: $ 28.25
aaa 01
02:00:01 04:23:59 4318 $ 638,80
total: $ 638,80

Descripción Tema:
Teniendo en cuenta una serie de registros de llamadas telefónicas, con los precios en diferentes periodos de tiempo para determinar la factura mensual de cada persona en función de las horas de inicio y fin.

Esbozo de solución:
todas las entradas de los registros al vector, a ordenar por tiempo de nombre; si mismo registro dos nombres, y el frente encendido a apagado después de que el cumplimiento; satisfaga los requisitos a una correspondiente del mapa de unidad de grabación de salida; obtenido factura mensual de cada persona.

Liu códigos de Dios: Portal

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
struct node {
    string name;
    int status, month, time, day, hour, minute;
};
bool cmp(node a, node b) {
    return a.name != b.name ? a.name < b.name : a.time < b.time;
}
double billFromZero(node call, int *rate) {
    double total = rate[call.hour] * call.minute + rate[24] * 60 * call.day;
    for (int i = 0; i < call.hour; i++)
        total += rate[i] * 60;
    return total / 100.0;
}
int main() {
    int rate[25] = {0}, n;
    for (int i = 0; i < 24; i++) {
        scanf("%d", &rate[i]);
        rate[24] += rate[i];
    }
    scanf("%d", &n);
    vector<node> data(n);
    for (int i = 0; i < n; i++) {
        cin >> data[i].name;
        scanf("%d:%d:%d:%d", &data[i].month, &data[i].day, &data[i].hour, &data[i].minute);
        string temp;
        cin >> temp;
        data[i].status = (temp == "on-line") ? 1 : 0;
        data[i].time = data[i].day * 24 * 60 + data[i].hour * 60 + data[i].minute;
    }
    sort(data.begin(), data.end(), cmp);
    map<string, vector<node> > custom;
    for (int i = 1; i < n; i++) {
        if (data[i].name == data[i - 1].name && data[i - 1].status == 1 && data[i].status == 0) {
            custom[data[i - 1].name].push_back(data[i - 1]);
            custom[data[i].name].push_back(data[i]);
        }
    }
    for (auto it : custom) {	//map迭代器相关
        vector<node> temp = it.second;
        cout << it.first;
        printf(" %02d\n", temp[0].month);
        double total = 0.0;
        for (int i = 1; i < temp.size(); i += 2) {
            double t = billFromZero(temp[i], rate) - billFromZero(temp[i - 1], rate);
            printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n", temp[i - 1].day, temp[i - 1].hour, temp[i - 1].minute, temp[i].day, temp[i].hour, temp[i].minute, temp[i].time - temp[i - 1].time, t);
            total += t;
        }
        printf("Total amount: $%.2f\n", total);=
    }
    return 0;
}

registro de aprendizaje:
1. Cuando se utiliza el mapa, valores clave no pueden utilizar una gran variedad de personajes, se debe utilizar la cadena.
2. Para total de buscan diferencia de tiempo puede emplearse para hacer con la diferencia en valor relativo 00:00:00.

Publicó un artículo original · ganado elogios 0 · Vistas 24

Supongo que te gusta

Origin blog.csdn.net/SallySEED/article/details/104770237
Recomendado
Clasificación