CCF-CSP Zhenti "202303-2 Land Cultivation Plan" ideas + python, c++ solución de puntuación completa

Los estudiantes que quieran consultar las preguntas reales y las soluciones de otras preguntas pueden dirigirse a: CCF-CSP preguntas reales con soluciones


Pregunta No.: 202303-2
Nombre de la pregunta: plano de cultivo
límite de tiempo: 1.0s
Limite de memoria: 512,0 MB
Descripción del problema:

Descripción del problema

Dunton seleccionó un total de n áreas para prepararse para la recuperación de tierras. Dado que los tamaños de cada área son diferentes, el tiempo requerido para la recuperación también es diferente. Se estima que el tiempo de recuperación del i-ésimo bloque (1≤i≤n) es de ti días. Estas n áreas se pueden recuperar al mismo tiempo, por lo que el tiempo total tTotal depende del área con el tiempo más largo, es decir: tTotal=max{t1,t2,⋯,tn}

Para acelerar el progreso de la recuperación, Dunton planea invertir recursos adicionales en algunas áreas para acortar el tiempo de recuperación. Específicamente:

  • Por cada unidad de recursos ci invertida en la i-ésima área , el tiempo dedicado a su recuperación se puede acortar en 1 día;

  • El número de días acortados y que consumen mucho tiempo se registra como un número entero, es decir, la cantidad de recursos invertidos en la i-ésima área debe ser un múltiplo entero de ci;

  • Se puede invertir un máximo de ci×(ti−k) unidades de recursos en la i-ésima área, acortando su tiempo de recuperación a k días;

  • Aquí k representa el número mínimo de días para recuperar un área, satisfaciendo 0<k≤min{t1,t2,⋯,tn}; en otras palabras, si se invierten recursos ilimitados, todas las áreas pueden recuperarse en k días.

Ahora Dunton tiene un total de m unidades de recursos disponibles para su uso. ¿Intenta calcular cuántos días se necesitan al menos para recuperar n áreas?

formato de entrada

Leer datos de la entrada estándar.

Introduzca un total de n+1 líneas.

La primera línea de entrada contiene tres números enteros positivos n, m y k separados por espacios, que representan respectivamente la cantidad total de áreas que se recuperarán, la cantidad de recursos en la mano de Dundun y la cantidad mínima de días para cada área que se recuperará. .

En las siguientes n líneas, cada línea contiene dos números enteros positivos ti y ci separados por espacios, que representan respectivamente el tiempo dedicado a la recuperación de la i-ésima área y la cantidad de recursos necesarios para acortar el tiempo en 1 día.

formato de salida

Salida a salida estándar.

Muestra un número entero, que representa el tiempo mínimo necesario para cultivar n áreas.

Ejemplo de entrada 1

4 9 2
6 1
5 1
6 2
7 1

Ejemplo de salida 1

5

ejemplo de explicacion

Como se muestra en la siguiente tabla, invertir 5 recursos reduce el tiempo total a 5 días. En este momento, Dun Dun todavía tiene 4 unidades de recursos en sus manos, pero no importa cómo lo organice, el tiempo total que consume no se puede acortar más.

i Ti básico que consume mucho tiempo Recursos reducidos requeridos por 1 día ci La cantidad de recursos invertidos Consumo de tiempo real
1 6 1 1 5
2 5 1 0 5
3 6 2 2 5
4 7 1 2 5

Ejemplo de entrada 2

4 30 2
6 1
5 1
6 2
7 1

Ejemplo de salida 2

2

ejemplo de explicacion

Invertir 20 unidades de recursos puede acortar el tiempo de recuperación de todas las áreas a k = 2 días; limitado por k, las 10 unidades de recursos restantes no pueden acortar más el tiempo.

subtareas

70% de los datos de prueba cumplen: 0<n,ti,ci≤100 y 0<m≤106;

Todos los datos de prueba cumplen: 0<n,ti,ci≤105 y 0<m≤109.

Fuente de la pregunta real: operación matricial

 Los estudiantes interesados ​​pueden codificar de esta manera para el envío de prácticas.

Ideas explicadas:

Esta pregunta no es difícil Use la matriz de banderas para registrar el área de i días que consume mucho tiempo para reducir el costo total de un día, y luego disminuya de mayor a menor, y finalmente puede obtener la respuesta.

Solución de partitura completa de C++:

#include<bits/stdc++.h>
#include<iostream>
using namespace std;

int n, k;
long long int m;
map<int, int>tim, res, flag;

int main(){
    cin >> n >> m >> k;

    int max = 0;
    for(int i = 0; i < n; ++i){
        cin >> tim[i] >> res[i];
        max = max > tim[i] ? max : tim[i];
        flag[tim[i]] += res[i];     
        // flag[i]为用时i天的区域缩短一天所用时
    }
    for(int i = max; i > 0; i--){
        //cout << i << " " << flag[i] << endl;
        if(max == k)break;
        if(m > flag[i]){
            m = m - flag[i];
            flag[i - 1] += flag[i];
            max--;
        }else break;
    }
    cout << max;
    return 0;
}

 resultado de la operación:

Supongo que te gusta

Origin blog.csdn.net/weixin_53919192/article/details/131490410
Recomendado
Clasificación