1026 Tenis de mesa (30 puntos) 1033 Para llenar o no llenar (25 puntos) Preguntas no hechas en serio

https://pintia.cn/problem-sets/994805342720868352/problems/994805472333250560

Un club de tenis de mesa tiene N mesas disponibles para el público. Las mesas están numeradas del 1 al N. Para cualquier pareja de jugadores, si hay mesas abiertas cuando llegan, se les asignará la mesa disponible con el número más pequeño. Si todas las mesas están ocupadas, tendrán que esperar en cola. Se supone que cada pareja de jugadores puede jugar durante 2 horas como máximo.

Su trabajo es contar para todos los que están en la cola su tiempo de espera y para cada mesa el número de jugadores a los que ha servido durante el día.

Una cosa que complica un poco este procedimiento es que el club reserva algunas mesas para sus miembros VIP. Cuando una mesa VIP está abierta, la primera pareja VIP en la cola tendrá el privilegio de tomarla. Sin embargo, si no hay un VIP en la cola, el próximo par de jugadores puede tomarlo. Por otro lado, si cuando es el turno de una pareja VIP, todavía no hay una mesa VIP disponible, pueden ser asignados como jugadores normales.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene un número entero  N (≤10000): el número total de parejas de jugadores. Luego  N siguen las líneas, cada una contiene 2 tiempos y una etiqueta VIP:  HH:MM:SS - la hora de llegada,  P - el tiempo de juego en minutos de un par de jugadores, y  tag - que es 1 si tienen una tarjeta VIP, o 0 si no. Se garantiza que la hora de llegada es entre las 08:00:00 y las 21:00:00 mientras el club esté abierto. Se supone que no llegan dos clientes al mismo tiempo. Después de la información de los jugadores, hay 2 números enteros positivos:  K (≤100) - el número de mesas y  M (<K) - el número de mesas VIP. La última línea contiene  M los números de la tabla.

Especificación de salida:

Para cada caso de prueba, imprima primero la hora de llegada, el tiempo de servicio y el tiempo de espera para cada par de jugadores en el formato que muestra la muestra. Luego imprima en una línea el número de jugadores atendidos por cada mesa. Tenga en cuenta que la salida debe enumerarse en orden cronológico del tiempo de servicio. El tiempo de espera debe redondearse a un número entero de minutos. Si no se puede conseguir una mesa antes de la hora de cierre, NO se debe imprimir su información.

Entrada de muestra:

9
20:52:00 10 0
08:00:00 20 0
08:02:00 30 0
20:51:00 10 0
08:10:00 5 0
08:12:00 10 1
20:50:00 10 0
08:01:30 15 1
20:53:00 10 1
3 1
2

Salida de muestra:

08:00:00 08:00:00 0
08:01:30 08:01:30 0
08:02:00 08:02:00 0
08:12:00 08:16:30 5
08:10:00 08:20:00 10
20:50:00 20:50:00 0
20:51:00 20:51:00 0
20:52:00 20:52:00 0
3 3 2
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
struct person {
    int arrive, start, time;
    bool vip;
}tempperson;
struct tablenode {
    int end = 8 * 3600, num;
    bool vip;
};
bool cmp1(person a, person b) {
    return a.arrive < b.arrive;
}
bool cmp2(person a, person b) {
    return a.start < b.start;
}
vector<person> player;
vector<tablenode> table;
void alloctable(int personid, int tableid) {
    if(player[personid].arrive <= table[tableid].end)
        player[personid].start = table[tableid].end;
    else
        player[personid].start = player[personid].arrive;
    table[tableid].end = player[personid].start + player[personid].time;
    table[tableid].num++;
}
int findnextvip(int vipid) {
    vipid++;
    while(vipid < player.size() && player[vipid].vip == false) vipid++;
    return vipid;
}
int main() {
    int n, k, m, viptable;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        int h, m, s, temptime, flag;
        scanf("%d:%d:%d %d %d", &h, &m, &s, &temptime, &flag);
        tempperson.arrive = h * 3600 + m * 60 + s;
        tempperson.start = 21 * 3600;
        if(tempperson.arrive >= 21 * 3600) continue;
        tempperson.time = temptime <= 120 ? temptime * 60 : 7200;
        tempperson.vip = ((flag == 1) ? true : false);
        player.push_back(tempperson);
    }
    scanf("%d%d", &k, &m);
    table.resize(k + 1);
    for(int i = 0; i < m; i++) {
        scanf("%d", &viptable);
        table[viptable].vip = true;
    }
    sort(player.begin(), player.end(), cmp1);
    int i = 0, vipid = -1;
    vipid = findnextvip(vipid);
    while(i < player.size()) {
        int index = -1, minendtime = 999999999;
        for(int j = 1; j <= k; j++) {
            if(table[j].end < minendtime) {
                minendtime = table[j].end;
                index = j;
            }
        }
        if(table[index].end >= 21 * 3600) break;
        if(player[i].vip == true && i < vipid) {
            i++;
            continue;
        }
        if(table[index].vip == true) {
            if(player[i].vip == true) {
                alloctable(i, index);
                if(vipid == i) vipid = findnextvip(vipid);
                i++;
            } else {
                if(vipid < player.size() && player[vipid].arrive <= table[index].end) {
                    alloctable(vipid, index);
                    vipid = findnextvip(vipid);
                } else {
                    alloctable(i, index);
                    i++;
                }
            }
        } else {
            if(player[i].vip == false) {
                alloctable(i, index);
                i++;
            } else {
                int vipindex = -1, minvipendtime = 999999999;
                for(int j = 1; j <= k; j++) {
                    if(table[j].vip == true && table[j].end < minvipendtime) {
                        minvipendtime = table[j].end;
                        vipindex = j;
                    }
                }
                if(vipindex != -1 && player[i].arrive >= table[vipindex].end) {
                    alloctable(i, vipindex);
                    if(vipid == i) vipid = findnextvip(vipid);
                    i++;
                } else {
                    alloctable(i, index);
                    if(vipid == i) vipid = findnextvip(vipid);
                    i++;
                }
            }
        }
    }
    sort(player.begin(), player.end(), cmp2);
    for(i = 0; i < player.size() && player[i].start < 21 * 3600; i++) {
        printf("%02d:%02d:%02d ", player[i].arrive / 3600, player[i].arrive % 3600 / 60, player[i].arrive % 60);
        printf("%02d:%02d:%02d ", player[i].start / 3600, player[i].start % 3600 / 60, player[i].start % 60);
        printf("%.0f\n", round((player[i].start - player[i].arrive) / 60.0));
    }
    for(int i = 1; i <= k; i++) {
        if(i != 1) printf(" ");
        printf("%d", table[i].num);
    }
    return 0;
}

 

https://pintia.cn/problem-sets/994805342720868352/problems/994805458722734080

Con las carreteras disponibles, conducir un automóvil desde Hangzhou a cualquier otra ciudad es fácil. Pero dado que la capacidad del tanque de un automóvil es limitada, tenemos que encontrar estaciones de servicio en el camino de vez en cuando. Diferentes estaciones de servicio pueden dar un precio diferente. Se le pide que diseñe cuidadosamente la ruta más barata.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene 4 números positivos: C max (≤ 100), la capacidad máxima del tanque; D (≤30000), la distancia entre Hangzhou y la ciudad de destino; D avg (≤20), la distancia promedio por unidad de gas que puede correr el automóvil; y N (≤ 500), el número total de estaciones de servicio. Luego siguen N líneas, cada una contiene un par de números no negativos: P i, el precio unitario del gas, y D i (≤D), la distancia entre esta estación y Hangzhou, para i = 1, ⋯, N. Todos los números de una línea están separados por un espacio.

Especificación de salida:

Para cada caso de prueba, imprima el precio más barato en una línea, con una precisión de hasta 2 lugares decimales. Se supone que el tanque está vacío al principio. Si es imposible llegar al destino, imprima  The maximum travel distance = X dónde  X está la distancia máxima posible que puede recorrer el automóvil, con una precisión de hasta 2 lugares decimales.

Entrada de muestra 1:

50 1300 12 8
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300

Salida de muestra 1:

749.17

Entrada de muestra 2:

50 1300 12 2
7.10 0
7.00 600

Salida de muestra 2:

The maximum travel distance = 1200.00
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int inf = 99999999;
struct station {
    double price, dis;
};
bool cmp1(station a, station b) {
    return a.dis < b.dis;
}
int main() {
    double cmax, d, davg;
    int n;
    scanf("%lf%lf%lf%d", &cmax, &d, &davg, &n);
    vector<station> sta(n + 1);
    sta[0] = {0.0, d};
    for(int i = 1; i <= n; i++)
        scanf("%lf%lf", &sta[i].price, &sta[i].dis);
    sort(sta.begin(), sta.end(), cmp1);
    double nowdis = 0.0, maxdis = 0.0, nowprice = 0.0, totalPrice = 0.0, leftdis = 0.0;
    if(sta[0].dis != 0) {
        printf("The maximum travel distance = 0.00");
        return 0;
    } else {
        nowprice = sta[0].price;
    }
    while(nowdis < d) {
        maxdis = nowdis + cmax * davg;
        double minPriceDis = 0, minPrice = inf;
        int flag = 0;
        for(int i = 1; i <= n && sta[i].dis <= maxdis; i++) {
            if(sta[i].dis <= nowdis) continue;
            if(sta[i].price < nowprice) {
                totalPrice += (sta[i].dis - nowdis - leftdis) * nowprice / davg;
                leftdis = 0.0;
                nowprice = sta[i].price;
                nowdis = sta[i].dis;
                flag = 1;
                break;
            }
            if(sta[i].price < minPrice) {
                minPrice = sta[i].price;
                minPriceDis = sta[i].dis;
            }
        }
        if(flag == 0 && minPrice != inf) {
            totalPrice += (nowprice * (cmax - leftdis / davg));
            leftdis = cmax * davg - (minPriceDis - nowdis);
            nowprice = minPrice;
            nowdis = minPriceDis;     
        }
        if(flag == 0 && minPrice == inf) {
            nowdis += cmax * davg;
            printf("The maximum travel distance = %.2f", nowdis);
            return 0;
        }
    }
    printf("%.2f", totalPrice);
    return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_42137874/article/details/104270134
Recomendado
Clasificación