[Greedy / binario] problema Ejercicio Week4 A + B + C

miedo A.ddl (codiciosos)

El significado de los problemas

Hay n ([1,1000]) de trabajo, cada uno sobre un correspondiente (el mismo consumo de cada unidad de tiempo de trabajo) DDL, si el trabajo no se realiza antes de que el DDL, la puntuación será deducido
requerido es mínimo el número de puntos deducidos

muestra

de entrada de la muestra:
el número de conjuntos de datos representativos de la primera fila de una digital de T
número representativo del número n de la primera fila de cada conjunto de trabajo de ejemplo de
ddl siguiente fila n digital de ai representa el i-ésimo trabajo
siguiente línea representa la n bi digitales puntuación de la i-ésima trabajo
3.
3.
3. 3. 3.
10. 5. 1
3.
1. 3. 1.
6. 3 2.
7.
1. 4. 3. 4 2. 6. 4.
3. 1 2. 4. 5. 6. 7.
salida de muestra:
un conjunto de salida de datos representa los menos ans una respuesta menos el puntaje en una línea separada
0
. 3
. 5


pensamiento

1. Cada tarea ddl orden de tamaño decreciente, es decir, en frente de la gran ddl

2. El tiempo t se inicializa al máximo ddl (t grande, entonces inútil, porque no hay necesidad de hacer el trabajo) que atraviesa hacia delante desde el tiempo t

3. en cada tiempo t, la de k (inicializa a 1) tarea para atravesar la matriz de n, en la que los valores de puntuación en la pila hasta que la gran tarea raíz [I] t no es igual a ddl y gran parte superior pop pila raíz de la pila elemento t-- Representante y el valor del tiempo t se completa q.top () tarea (nota para cada bucle también aumentan desde k es k para cada iteración, debido a que el inicio de la índice de vector de tareas)

4. procesamiento t acabado en el montón después sumando todos los elementos, a saber, una deducción mínimo de puntos


resumen

1. Desde cada puesto de trabajo a sólo 1 unidad de tiempo, el impacto en la programación de otras operaciones es muy pequeña, así que tenemos que priorizar puntuación más alta para los trabajos

2. Para un trabajo, que esperamos que se complete lo más tarde posible, lo que puede poner frente al trabajo de frente ddl dar tiempo, y luego invertir el recorrido t

optimizar el rendimiento gran montón de raíz 3 debido a la necesidad de mantener el máximo, se considera


código

#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#define MAXN 1010
using namespace std;
struct task
{
    int score;
    int ddl;
    bool operator <(const task & x ) const{
        if(ddl!=x.ddl)  return ddl>x.ddl;
        else return score>x.score;
    }
}a[MAXN];
bool cmp(task a,task b)
{
    if(a.ddl!=b.ddl)    return a.ddl>b.ddl;
}
int main()
{
    int T,n;
    cin>>T;
    while(T--)
    {
        int ans=0;
        priority_queue< int > q;
        cin>>n;
        for(int i=1;i<=n;i++)   cin>>a[i].ddl;
        for(int i=1;i<=n;i++)   cin>>a[i].score;
        sort(a+1,a+n+1,cmp);
        int t=a[1].ddl;//我们只需要考虑时间[1,t]内
        int k=1;
        while(t!=0)
        {
            for(int i=k;i<=n&&a[i].ddl==t;i++,k++)  q.push(a[i].score);
            if(!q.empty())  q.pop();//每个时刻内完成一个任务(如果有任务)
            t--;
        }
        while(!q.empty())
        {
            ans+=q.top();//剩下的任务是没被做完的
            q.pop();
        }
        cout<<ans<<endl;
    }

    return 0;
}

B. cuatro columnas (dos puntos)

El significado de los problemas

Cuatro contiene n ([1,4000]) elementos de la serie abcd, que representa un número de la serie de las columnas 4, preguntar cuántos tales emulado y el número 4 es 0 (si es un número de columnas en el mismo tamaño elementos, como dos elementos diferentes del proceso)

muestra

de entrada de la muestra:
una primera línea de un número n
siguiente n líneas cada número representa los cuatro BI CI DI AI (AI, BI, CI, DI <= 2 ^ 28)
. 6
-45 22 es 42 es -16
-41 -27 56 es 30
-36 77 -37 53 es
-36 30 -46 -75
26 es -38 -10 62 es
-32 -6 -54 45
salida de la muestra:
total da salida a un programa de representación digital
5


pensamiento

1. enumeración de todas las combinaciones de A y B, y se almacena en todo vector posible
2. El vector en orden ascendente
3. Todas las combinaciones enumeradas c y d, con d y c para encontrar la inversa del vector binario . Es decir, en primer lugar encontrar el índice más pequeño, el índice máximo y luego para buscar y añadir 1 reste


resumen

1.N = 4000 Los datos que representan sólo utilizamos o n ^ 2 ^ n 2 log n programas y tamaño de datos de 2 ^ 28 es tal que no podemos utilizar el método del cubo tipo que es simple y fácil de escribir, por lo que sólo puede guardar en un recipiente y luego para averiguarlo.

2. encontrar elementos en una secuencia ordenada, binario algoritmo de búsqueda es sin duda la mejor ^ ^


código

#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<vector>
#define MAXN 5010
using namespace std;
int a[MAXN],b[MAXN],c[MAXN],d[MAXN];
int n,ans;
vector<int> v;
int check(int x)
{
    int l=0,r=v.size()-1,mid,min_index=-1,max_index=-1;
    while(l<=r)//找最小下标
    {
        mid=(l+r)/2;
        if(v[mid]>x)    r=mid-1;
        else if(v[mid]<x)   l=mid+1;
        else if(v[mid]==x)  {r=mid-1;min_index=mid;}
    }
    l=0;r=v.size()-1;
    while(l<=r)//找最大下标
    {
        mid=(l+r)/2;
        if(v[mid]>x)    r=mid-1;
        else if(v[mid]<x)   l=mid+1;
        else if(v[mid]==x)  {l=mid+1;max_index=mid;}
    }
    if(min_index==-1)   return 0;
    else return max_index-min_index+1;
}


int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)   cin>>a[i]>>b[i]>>c[i]>>d[i];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)   v.push_back(a[i]+b[j]);

    sort(v.begin(),v.end());

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)   ans+=check(-c[i]-d[j]);
    
    cout<<ans<<endl;
    system("pause");
    return 0;
}

C.TT misterio regalo

El significado de los problemas

Dada array gato [i] un número N, y generar una nueva ans array [i] con la matriz. Se define como la nueva matriz para cualquier i, j e i = j, son ans [] = abs (cat [i] - gato [j]) !, 1 <= i <j <= N. Esta nueva matriz. Determinar la mediana, a continuación, la mediana es la especie (LEN + 1) / 2 que corresponde al número de posición, '/' es un redondeo.


muestra

de entrada de la muestra:
múltiples conjuntos de entrada que cada entrada de N, el número de N expresado, después de la entrada de una secuencia de longitud N CAT, CAT [I] <= 1E9 ,. 3 <= n - <= 1E5
4.
1 2. 4. 3.
3.
1102
resultado de ejemplo:
salida nueva matriz American National Standard mediana
1.
8.


pensamiento

1. Podemos ordenado primera secuencia de ai, aj que predeterminadas j> i por lo pongo aparte a un valor absoluto del número

2. Dado que para una nueva serie de números, que va a cambiar con el fin de aumentar el valor de aumenta , por lo que pueden respuesta dicotómica

3. por lo tanto, podemos primera mitad de la respuesta, suponiendo que la respuesta es mediados, orden de una nueva secuencia se calcula entonces mediados, si menos de la mediana de intervalo para tener en cuenta la derecha, si no en Mirando a la derecha del intervalo, mientras que el registro de los ans de actualización ( Nota que el orden de la mediana no es necesariamente exactamente n posición (n-1) / 2 pueden contener como un elemento de secuencia de repetición, como 1.122.232 de = 5! = se requiere 2 pero 3 por lo que es igual a la mediana normalizado a> dentro *)

4. responder a una consulta por el orden del tiempo que está en conformidad con el binario convencional aj-EA <= x i entonces podemos enumerar bipartito Buscando aj <= Ai + x con el índice máximo i y sumando restando es el orden actual de respuestas


resumen

N 1. 1E5 es preguntas presentes, si violenta por la enumeración de todos, combinaciones de j i, y encontrar su especie mediana, la complejidad O (n ^ 2logn ^ 2) niveles es claramente inadecuado de

2. Por lo tanto, este título utiliza una respuesta de primera mitad otra dicotomía común determinar el orden del método de respuesta actual reduce en gran medida la complejidad tiempo del procedimiento de

respuesta 3-medio este enfoque tiene una muy amplia gama de aplicaciones, pero puede no ser capaz de ver la carretera la cuestión no puede ser utilizado para hacer la mitad de la respuesta, por lo que la clave es ver si existe mitad de la respuesta que hacer

código

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define MAXN 200010
int cat[MAXN];
int n;
using namespace std;
int func(int x,int i)//该函数用于计算有多少个 cat[j] <=x 即 j的最大值 
{
    int l=1,r=n,mid,ans=-1;
    while(l<=r)
    {
        mid=(l+r)>>1;
        if(cat[mid]<=x)  {ans=mid;l=mid+1;}
        else if(cat[mid]>x) r=mid-1;
    }
    if(ans==-1) return 0;
    else return ans-i;
}
int main()
{
    // freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    while(scanf("%d", &n) != EOF)
    {
        for(int i=1;i<=n;i++)  scanf("%d",&cat[i]);
        sort(cat+1,cat+n+1);//为了拆除绝对值号 约定让 aj-ai 其中j>=i        
        //基本思路为二分答案 假设p是答案 计算 aj-ai<=p 的所有序偶 即 aj<=ai+p
        int l=0,r=cat[n]-cat[1],mid;//中位数的取值在 0 到 最大减最小之间
        //中位数为排序之后 (len+1)/2位置的数字 故 <=zws 的数有(len+1)/2个
        int len=n*(n-1)/2,ans=0;
        int zws_rank=(len+1)/2;//长度为 1+2+3+···+n-1 = n(n-1)/2
        while(l<=r)//此处为二分答案的框架  计算 mid 排在第几位
        {
            mid=(l+r)>>1;
            int sum=0;
            for(int i=1;i<=n;i++)    sum+=func(cat[i]+mid,i);
            if(sum>=zws_rank)    {ans=mid;r=mid-1;}
            else if(sum<zws_rank)   l=mid+1;
        }
        cout<<ans<<endl;
    }
    return 0;
}
Publicado 12 artículos originales · ganado elogios 0 · Vistas 506

Supongo que te gusta

Origin blog.csdn.net/linshen_jianhai/article/details/104850877
Recomendado
Clasificación