Codeforces 1305 E. Kuroni y la distribución de puntajes (构造)

Enlace al
tema La idea principal del tema: los
números dados ny m. Construyamos una matriz entera positiva y de tamaño n. Hay dos condiciones:

  1. La matriz debe ser una matriz estrictamente creciente, y el número en la matriz no puede exceder 10 9 .
  2. La matriz debe contener m triples, de los cuales triples (i, j, k) deben satisfacer ans [i] + ans [j] = ans [k], (1≤i <j <k≤n)

Ideas para resolver problemas:
podemos ver que una estructura es suponer que el número actual es cur, y m en este momento es 0, y suponemos que k = cur + 1. Entonces la siguiente matriz es cur + k, cur + 2 k, cur + 3 k, ... cur + m * k, entonces la diferencia entre estos dos números debe ser un múltiplo de k, pero ninguno de los números que construimos después de cur Múltiplo de k. Debido a que los números antes de cur son menores que k, los números antes de cur también son imposibles. Entonces podemos lidiar con la situación de m = 0 de acuerdo con esta estrategia de construcción.
Si m no es igual a 0, podemos ver que construir 1,2,3,4,5 generará la mayor cantidad de triples. Entonces, codiciosos para quedarnos sin m primero, y luego construir de acuerdo con la estrategia anterior.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[6000],m;
int main()
{
    ll n;
    cin>>n>>m;
    ll k=2;
    a[1]=1;
    for (int i=2;i<=n;i++)
    {
       if (m==0)
       {
           a[i]=a[i-1]+k;
           continue;
       }
       if (m>(i-1)/2)
       {
           a[i]=i;
           m-=(i-1)/2;
       } 
       else
       {
           ll r=i-1,l=i-m*2;
           a[i]=a[l]+a[r];
           m=0;
           k=a[i]+1;
       }
    }
    if (m>0)
    {
        cout<<-1;
        return 0;
    }
    for (int i=1;i<=n;i++)
    cout<<a[i]<<" ";
}
12 artículos originales publicados · Me gusta1 · Visitas 327

Supongo que te gusta

Origin blog.csdn.net/qq_41818939/article/details/104657060
Recomendado
Clasificación