AtCoder Beginner Contest 161 (D (cola de prioridad), E (simulación), F (derivación matemática))

Enlace del título

D - Número de Lunlun

Tema: es bueno definir un número: el valor absoluto de la diferencia entre cada bit adyacente es menor o igual a 1, ingrese k y le pida que encuentre el número k bueno.

En la práctica, la cola prioritaria se coloca en 1,2,3,4,5,6,7,8,9 una a la vez, hay tres variantes que se pueden volver a colocar:

Conecte el único dígito actual al final, el único dígito menos un dígito más uno

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
int a[200],len;
int main()
{int k;
   cin>>k;
   if(k<=12){
      cout<<k;
      return 0;
   }
   priority_queue<ll,vector<ll>,greater<ll>> pq;
   for(int i=1;i<=9;i++)
   pq.push(i);

   int cnt=0;
   ll ans;
   while(true){
      ll num=pq.top();
      pq.pop();
      cnt++;

      if(cnt==k){
         ans=num;
         break;
      }

      int ld=num%10;
      ll num1=num*10+ld;
      pq.push(num1);

      if(ld!=0){
         num1=num*10+ld-1;
         pq.push(num1);
      }
      if(ld!=9){
         num1=num*10+ld+1;
         pq.push(num1);
      }
   }
   cout<<ans;
}

E-Yutori

Tema: Ingrese la cadena s de longitud n, k, c y n.

Debe elegir el carácter 'o' en la cadena s para trabajar durante k días. El protagonista es un vago, y debe descansar durante c días cada vez que trabaja un día.

P. Cuando trabaja por al menos k días, ¿qué días se requieren para trabajar?

Práctica: simule codicioso, de todos modos, simula codicioso, hay una simulación de días hábiles mayor que k, entonces no hay respuesta. De lo contrario, es solo la intersección de las dos simulaciones.

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=2e5+10;
int n,k,c,pre[N];
char s[N];
int main()
{
    cin>>n>>k>>c;
    cin>>s+1;
    set<int>st1,st2;
    for(int i=1;i<=n;++i){
        if(s[i]=='x') continue;
        else{
            st1.insert(i);
            i+=c;
        }
    }

    for(int i=n;i>=1;--i){
        if(s[i]=='x') continue;
        else st2.insert(i),i-=c;
    }
    if(st1.size()>k||st2.size()>k) return 0;
    else{
        for(int v:st1){
            if(st2.count(v)) printf("%d\n",v);
        }
    }
}

F - División o sustracción

Tema: Déle una N y solicite el número de soluciones legales de su K.

Condiciones de selección para K:

Si K divide N por N, entonces N = N / K

De lo contrario, N = NK

Continúe operando para que N finalmente sea igual a 1.

Práctica: No, la solución de búsqueda proviene de: esto

Piénselo: cuando n = 0, N% (N-1) == 1 Entonces el factor de N% (N-1) también es igual a 1.

Cuando n> 0, el único factor que puede dividir N es N. Después de leer el problema, la solución es muy simple. Si no mira el problema, no lo pensará.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    ll n;cin>>n;

    set<ll> st;
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            ll t=n;
            while(t%i==0) t/=i;
            if(t%i==1) st.insert(i);
        }
    }
    for(ll i=1;i*i<=n-1;i++){
        if((n-1)%i==0){
            st.insert(i);
            st.insert((n-1)/i);
        } 
    }
    st.erase(1);
    st.insert(n);

    cout<<st.size()<<"\n";
    
    return 0;
}

 

519 artículos originales publicados · elogiados 69 · 50,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_41286356/article/details/105329129
Recomendado
Clasificación