Campamento de verano 2 2

Juego de zuma

Zuma es un juego clásico. En el juego, n cuentas están conectadas en una cuerda y corren en una pista, y cada cuenta tiene un color. El objetivo del juego es eliminar estas cuentas tanto como sea posible.
Los jugadores pueden controlar el lanzador para lanzar cuentas a la órbita, y las cuentas se insertarán entre esta cadena de cuentas (también se pueden agregar antes de la primera cuenta o después de la enésima cuenta). Si después del lanzamiento, hay 3 o más cuentas en el mismo segmento de color de las cuentas lanzadas, estas cuentas serán eliminadas; si la cadena de cuentas se divide en dos partes después de la eliminación, las dos partes se fusionarán, si son nuevas. Si el mismo segmento de color contiene 3 o más perlas, estas perlas continuarán eliminándose; el proceso continuará hasta que no se pueda eliminar.
Ahora dé los colores de n cuentas de izquierda a derecha, y solicite la secuencia de cuentas obtenida después de que se emita una nueva cuenta de color c entre la x ésima cuenta y la x + 1ª cuenta. En particular, cuando x = 0, significa agregar cuentas antes de la primera cuenta; cuando x = n, significa agregar cuentas después de la n-ésima cuenta.
El segmento continuo más largo que consta de cuentas del mismo color que contiene una determinada cuenta se denomina segmento del mismo color donde se encuentra la cuenta. Nota: Si el mismo segmento de color que contiene 3 o más cuentas existe al principio, no se eliminará directamente.

Simule la posición agregada, si se puede conectar, luego continúe expandiendo hacia afuera

#include<bits/stdc++.h>
using namespace std;
string s;
int x,len;
char c;
int main()
{
    
    
    cin>>len>>s>>x>>c;
    if(!x)s=c+s;
    else if(x==len)s=s+c;
    else s=s.substr(0,x)+c+s.substr(x,s.size());
    while(1) 
    {
    
    
      int l=x,r=x;
      while(s[l]==s[x])l--;l++;
      while(s[r]==s[x])r++;r--;
      if((r-l+1)<3)break;
      s=s.substr(0,l)+s.substr(r+1,s.size());
      x=l-1;
      if(x<0)break; 
    }
    cout<<s;
    return 0;
}


División de secuencia

Inserte la descripción de la imagen aquí

Podemos considerar la clasificación de la discusión
1. El número máximo de tres y sin duda se puede separar;
2. La discusión de clasificación considera el valor mínimo
cuando el valor máximo en ambos lados: el valor máximo del valor máximo del valor máximo derecho + izquierdo + centro
cuando El valor máximo está en el medio: prefijo valor máximo + valor medio + sufijo valor máximo
(prueba) si se corta la derecha o la izquierda, asumiendo que el corte es más grande que el medio, la respuesta se vuelve más grande, y si es más pequeño que el medio, la respuesta permanece sin cambios

#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
int  hsum[200010],tsum[200010],a[200010],n,b[200010];
int maxnans,minans;
int main()
{
    
    
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
    
    
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    sort(b+1,b+1+n);for(int i=n;i>=n-2;i--)maxnans+=b[i];//做最大值
 
    for(int i=2;i<n;i++)minans=max(minans,a[i]);//写把答案设定为当最大值在两边的情况,然后更新
    minans+=a[1]+a[n];
     
    for(int i=2;i<=n;i++)
    hsum[i]=max(hsum[i-1],a[i-1]);//前缀最大
     
 
    for(int i=n-1;i>=1;i--)
    tsum[i]=max(tsum[i+1],a[i+1]);//后缀最大
     
    for(int i=2;i<n;i++)
    minans=min(minans,a[i]+hsum[i]+tsum[i]);//算第二种方法,打擂台
    cout<<minans<<' '<<maxnans;
    return 0;
}

Salida de otoñoInserte la descripción de la imagen aquí

Al ingresar un borde, puede dividir este borde, agregar el peso del borde a los pesos de los dos puntos del borde y restar el peso del borde del ans. Si se seleccionan ambos, uno se desplaza y el otro se agrega. Si no elige, entonces ya eligió, entonces elija codicioso

#include<bits/stdc++.h>
using namespace std;
int n,m;
inline int read()
{
    
    
    int f=1;
    int res=0;char ch=getchar();
    while(!isdigit(ch)){
    
    if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch))res=(res<<1)+(res<<3)+(ch&15),ch=getchar();
    return res*f;
}
int x,y,z,a[100010],ans;
bool cmp(int a,int b)
{
    
    
    return a>b;
}
int main()
{
    
    
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<=m;i++)
    {
    
    
        x=read();y=read();z=read();
        a[x]+=z;//妙啊
        a[y]+=z;//妙啊
        ans-=z;
    }   
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
    
    
        ans+=a[i];
        printf("%d\n",ans);
    }
    return 0;
}


Edición mejorada de cría de conejos

Inserte la descripción de la imagen aquí

Comentar directamente

#include<bits/stdc++.h>
#define maxn 10000010
#define mod 10007
#define ll long long 
using namespace std;
ll k,n,t,m;
int dp[maxn],g[maxn];
inline int read()//读入优化
{
    
    
    int f=1;
    int res=0;char ch=getchar();
    while(!isdigit(ch)){
    
    if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch))res=(res<<1)+(res<<3)+(ch&15),ch=getchar();
    return res*f;
}
int main()
{
    
    
    n=read();k=read();t=read();m=read();
    dp[1]=1;g[1]=1;
    
    for(int i=2;i<=n;i++)
    {
    
       
        g[i]=(dp[max(0ll,i-k)]-dp[max(i-(k+m*t),0ll)]+mod)%mod;//假新生的兔子-死掉的兔子=实际新生的兔子
        dp[i]=(g[i]+dp[max(i-t,0ll)])%mod;//新生的兔子加上上个月的兔子
 
    }
    ll ans=0;
    for(int i=max(n-k-(m-1)*t+1,1ll);i<=n;i++)ans+=g[i],ans%=mod;//没死的兔子加起来就是答案
    cout<<ans%mod<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/yhhy666/article/details/108264832
Recomendado
Clasificación