PAT 1016 (más o menos)

1016 facturas de teléfono (25) 分


Una compañía telefónica de larga distancia cobra a sus clientes por las siguientes reglas:

Cómo hacer una llamada de larga distancia cuesta una cierta cantidad por minuto, dependiendo de la hora del día en que se realiza la llamada. Cuando un cliente inicia la conexión de una llamada de larga distancia, el tiempo será registrado, y así será el momento en que los clientes se cuelga el teléfono. Cada mes, un proyecto de ley se envía al cliente por cada minuto llamada (a una tasa determinada por la hora del día). Su trabajo es preparar las facturas de cada mes, dado un conjunto de registros de llamadas telefónicas.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba que evalúa la estructura y los registros de llamadas telefónicas.

La estructura de tasa consiste en una línea con 24 no negativos números enteros que denotan el peaje (centavos / minuto) desde las 00:00 - 01:00, el número de 01:00 - 02:00, y así sucesivamente para cada hora en el día .

La siguiente línea contiene un número N positivo (≤1000), seguido de N líneas de registros. Cada registro de llamada telefónica consiste en el nombre del cliente (cadena de hasta 20 caracteres sin espacio), la hora y la fecha ( mm:dd:hh:mm), y la palabra  on-line o  off-line.

Para cada caso de prueba, todas las fechas estarán dentro de un solo mes. Cada  on-line registro está emparejado con el orden cronológico siguiente registro para el mismo cliente siempre y cuando sea un  off-line récord. Cualquier  on-line registros que no están vinculados con un  off-line registro son ignorados, al igual que  off-line los registros no se combina con un  on-line registro. Se garantiza que al menos una llamada está bien combinados en la entrada. Usted puede asumir que no hay dos registros para el mismo cliente tienen el mismo tiempo. Los tiempos se registran utilizando un reloj de 24 horas.

Especificación de la salida:

Para cada caso de prueba, debe imprimir una factura de teléfono para cada cliente.

Las facturas deben ser impresos por orden alfabético de los nombres de los clientes. Para cada cliente, imprima primero de una línea el nombre del cliente y el mes de la factura en el formato mostrado por la muestra. Luego, para cada período de tiempo de una llamada, imprimir en una línea de la que comienza y termina hora y la fecha ( dd:hh:mm), el tiempo de duración (en minutos) y el cargo de la llamada. Las llamadas deben ser listadas en orden cronológico. Por último, imprima la carga total para el mes en el formato mostrado por la muestra.

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 on-line
CYLL 01:28:16:05 off-line
CYJJ 01:01:07:00 off-line
CYLL 01:01:08:03 off-line
CYJJ 01:01:05:59 on-line
aaa 01:01:01:03 on-line
aaa 01:02:00:01 on-line
CYLL 01:28:15:41 on-line
aaa 01:05:02:24 on-line
aaa 01:04:23:59 off-line

Ejemplo de salida

CYJJ 01
01:05:59 01:07:00 61 $12.10
Total amount: $12.10
CYLL 01
01:06:01 01:08:03 122 $24.40
28:15:41 28:16:05 24 $3.85
Total amount: $28.25
aaa 01
02:00:01 04:23:59 4318 $638.80
Total amount: $638.80

 


En primer lugar, el análisis de temas

A los cargos de la compañía telefónica de larga distancia de acuerdo con las siguientes reglas: de acuerdo con el tiempo dedicado a las llamadas, llamadas de larga distancia costarán una tarifa por minuto. Cuando un usuario inicia una llamada de larga distancia, se registrará el tiempo, y cuando se grabará cuelga usuario se registra el tiempo. Mensual factura mensual enviada al usuario (la tasa se determina por la hora del día). Su trabajo consiste en preparar una factura mensual de los registros de llamadas de teléfono.

Introducir información:

  • Tasa (número entero no negativo 24): 0-1,1-2 ... 22-23,23-24
  • El número de registros (N≤1000): cada registro para cada prueba en el mismo mes; fuera de línea para la siguiente grabación, la grabación no se empareja con cualquier registro cronológico en línea y fuera de línea con un usuario se registra en línea será ignorado, no se combina con los registros fuera de línea en línea será ignorado. Asegúrese de introducir al menos una llamada un buen emparejamiento. Usted puede asumir que no hay dos registros para el mismo cliente al mismo tiempo. Utilizar el tiempo de grabación de 24 horas.
  1. Nombre de usuario: 20 caracteres, sin espacios
  2. Fecha y hora: el tiempo :: mes: por puntos del día
  3. Identificación: línea sobre / fuera de línea

Salida: Orden de diccionario, de acuerdo con el nombre del usuario

  •  La primera línea:
  1. Nombre de usuario
  2. factura Mes (Ejemplo de acuerdo con el formato de salida)
  • Las próximas líneas :( orden cronológico)
  1. Cada llamada hora de inicio, hora de finalización (según dd:hh:mm的格式)
  2. La duración tiempo total (calculado en minutos)
  3. La llamada a gastar mucho dinero
  • realización, la última línea :( de acuerdo con el formato de salida)
  1. El total de costos meses los usuarios

En segundo lugar, las ideas de resolución de problemas:

Queremos elegir a una información de la llamada eficaz para cada usuario (en orden cronológico con un registro de usuario en línea para el siguiente registro off-line), por lo que todos los registros de entrada primero ordenados por nombre de usuario diccionario orden, a continuación, de acuerdo con la fecha y la hora clasificación (fecha, hora, minuto), después de registros coincidentes ordenados en el registro de llamada seleccionada para cada usuario, el tiempo de cálculo del número de minutos, y la cantidad de consumo de emparejamiento .

  • Estructura de almacenamiento:
  1. Se registra como una estructura: nombre de usuario de almacenamiento de registros, hora de inicio, hora de finalización, los signos
  2. 24 horas tasa de intervalo de: almacenar la matriz
  • Entrar por las normas:
  1. Con una entrada de caracteres cin inconveniente y consume mucho tiempo un formato particular, por lo que aquí con scanf y printf (COUT cin y preferiblemente no mezcla)
  2. Usar cadena char [] (no representado tipo Scanf String)
  • Ordenar por:
  1. sort (rec, rec + n, cmp);
  2. reescritura de las reglas especifican la función de clasificación cmp
  • Cada registro de usuario seleccionado emparejamiento:
  1. Determina si hay un registros de llamadas válidas: En needprint (= 0) como un signo (= 1 se encuentra encendido, apagado en la base de la experiencia es = 2; no grabar la próxima vez que un usuario válido)
  2. Hay aún más encontrar un registro coincidente registros válidos (en este caso un usuario ha identificado una serie de [en, al lado)):

  (2,1) valor se determina en la escala: se encuentra una coincidencia de acuerdo con ciertas condiciones en línea y fuera de línea de grabación

  (2.2) determinar el valor del índice off:. Off + 1 = ON (si fuera fuera de los límites, entonces el registro es ya no emparejamiento)

  (2.3) el cálculo del coste de este registro de sincronización: la hora de inicio más 1 determina continuamente si llega el tiempo de expiración, y las tarifas de cada suma minuto pasado (centavos de conversión de unidades -> Estados Unidos; dos cifras decimales)

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

const int maxn=1010;
int toll[25]; //每小时区间内:每分钟多少钱
//结构体
struct Record{
    char name[25]; //姓名最多20个字符
    int month,dd,hh,mm;
    bool status; //true表示记录为online,否则为offline
}rec[maxn],temp;

//排序规则的制定
bool cmp(Record a,Record b){
    int s=strcmp(a.name,b.name);
    if(s!=0) //按名字字典顺序从小到大排序
        return s<0;
    else if(a.month!=b.month) //按月份从小到大排序
        return a.month<b.month;
    else if(a.dd!=b.dd) //按日期从小到大排序
        return a.dd<b.dd;
    else if(a.hh!=b.hh) //按小时从小到大排序
        return a.hh<b.hh;
    else //按分钟从小到大排序
        return a.mm<b.mm;
}

void get_ans(int on,int off,int &time,int &money){
    temp=rec[on];
    while(temp.dd<rec[off].dd||temp.hh<rec[off].hh||temp.mm<rec[off].mm){ //不断将起始时间加1,判断是否到达终止时间
        time++; //该次记录总时间加1min
        money+=toll[temp.hh]; //按照本小时区间的费率相加
        temp.mm++;
        if(temp.mm>=60){
            temp.mm=0;
            temp.hh++;
        }
        if(temp.hh>=24){
            temp.hh=0;
            temp.dd++;
        }
    }
}
int main()
{
    //数据的输入
    for(int i=0;i<24;i++){ //24小时每小时区间的资费
        scanf("%d",&toll[i]);
    }
    int n;
    scanf("%d",&n); //记录数
    char line[10]; //临时存放on-line和off-line的输入
    for(int i=0;i<n;i++){ //n条记录的具体信息
        scanf("%s",rec[i].name);
        scanf("%d:%d:%d:%d",&rec[i].month,&rec[i].dd,&rec[i].hh,&rec[i].mm);
        scanf("%s",line);
        if(strcmp(line,"on-line")==0){
            rec[i].status=true;
        }else{
            rec[i].status=false;
        }
    }

    //所有记录按规则排序
    sort(rec,rec+n,cmp);

    //查找并输出配对记录
    int on=0;
    int off;
    int next;
    while(on<n){
        //判断是否有配对、记录下一个用户编号next
        int needprint=0;
        next=on; //从当前位置开始寻找下一个用户
        while(next<n&&strcmp(rec[next].name,rec[on].name)==0){
            if(needprint==0&&rec[next].status==true){ //找到on
                needprint=1;
            }else if(needprint==1&&rec[next].status==false){ //找到on之后的第一个off
                needprint=2;
            }
            next++; //不断递增,直到找到下一个用户
        }
        if(needprint<2){ //该用户没有匹配的记录on-off
            on=next;
            continue; //继续找下一个用户
        }

        int allmoney=0;
        printf("%s %02d\n",rec[on].name,rec[on].month); //用户名和月份
        while(on<next){
            while(on<next-1&&!(rec[on].status==true&&rec[on+1].status==false)){
                on++;
            }
            off=on+1;
            if(off==next){ //所有配对已输出完毕,无配对
                on=next;
                break;
            }

            printf("%02d:%02d:%02d ",rec[on].dd,rec[on].hh,rec[on].mm);
            printf("%02d:%02d:%02d ",rec[off].dd,rec[off].hh,rec[off].mm);
            int time=0;
            int money=0;
            get_ans(on,off,time,money);
            allmoney+=money;
            printf("%d $%.2f\n",time,money/100.0);
            on=off+1;
        }
        printf("Total amount: $%.2f\n",allmoney/100.0);
    }

    return 0;
}

 

Publicado 30 artículos originales · ganado elogios 2 · Vistas 8100

Supongo que te gusta

Origin blog.csdn.net/Ariel_x/article/details/104099028
Recomendado
Clasificación