Cerca de reparación (codicioso, cola de prioridad)

Farmer John quiere reparar una pequeña longitud de la valla alrededor de la pastura. Se mide la valla y hallazgos que necesita N (1 ≤ N ≤ 20000) tablas de madera, teniendo cada una cierta extensión número entero Li unidades (1 ≤ Li ≤ 50000). Él entonces adquiere una sola placa de largo el tiempo suficiente para sierra en los tablones de N (es decir, cuya longitud es la suma de las longitudes Li). FJ está ignorando el “corte”, la longitud adicional perdida de serrín cuando se realiza un corte con sierra; usted debe ignorarlo, también.
FJ cuenta con tristeza que él no posee una sierra con la que cortar la madera, por lo que mosies a la granja del granjero Don con esta tabla larga y cortésmente le pregunta si puede tomar prestada una sierra.
Agricultor Don, un capitalista de armario, no se presta FJ una sierra sino que ofrezca cobrar Farmer John para cada uno de los cortes N-1 en el tablón. El cargo a cortar un trozo de madera es exactamente igual a su longitud. Cortar un tablón de longitud 21 cuesta 21 centavos.
Agricultor don luego deja Farmer John decidir el orden y ubicaciones para cortar la plancha. Ayuda Farmer John determinar la cantidad mínima de dinero que puede gastar para crear las tablas N. FJ sabe que puede cortar la tabla en varios órdenes diferentes que dan lugar a diferentes cargos desde los tablones intermedios resultantes son de diferentes longitudes.
Entrada

   Line 1: One integer 
   N, the number of planks 

Las líneas 2 ...
N + 1: Cada línea contiene un solo número entero que describe la longitud de un tablón necesaria
de salida

   Line 1: One integer: the minimum amount of money he must spend to make 
   N-1 cuts
  Sample Input3

8
5
8Sample Output34Hint

   He wants to cut a board of length 21 into pieces of lengths 8, 5, and 8. 

El tablero original mide 8 + 5 + 8 = 21. El primer corte costará 21, y debe ser usado para cortar la placa en trozos de 13 y 8. El segundo corte costará 13, y debe ser usada para cortar el 13 en 8 y 5. Esto costaría 21 + 13 = 34 . Si el 21 se cortó en 16 y 5 en su lugar, el segundo corte costaría 16 para un total de 37 (que es más de 34).

Título charla sobre un tablero dividido en N bloques (L1 ... LN), cada corte tiene una longitud de madera a cortar, encontrar el mínimo coste

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <time.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#include <string>
#include <queue>
#include <vector>
#define sqr(x) (x)*(x)
#define inf 0x3f3f3f3f
#define PI 3.1415926535
#define mm 20001
using namespace std;
int n,l,ans=0;
int main()
{
 cin>>n;
 priority_queue<int, vector<int>, greater<int> > que; for(int i=0;i<n;i++)
 {
  cin>>l;
  que.push(l);
 }
 while(que.size()>1)
 {
  int l1,l2;
  l1=que.top();
  que.pop();
  l2=que.top();
  que.pop();
  ans+=l1+l2;
  que.push(l1+l2);
 }
 printf("%lld\n",ans);
}
Publicado 12 artículos originales · ganado elogios 1 · visitas 198

Supongo que te gusta

Origin blog.csdn.net/csx_zzh/article/details/105055725
Recomendado
Clasificación