Lección 1 de ACM

Complejidad de tiempo

Inserte la descripción de la imagen aquí
La complejidad de tiempo se clasifica de menor a mayor. Inserte la descripción de la imagen aquí
La complejidad de tiempo final del algoritmo está determinada por la frecuencia de la declaración más interna en la declaración de bucle con los niveles más anidadosInserte la descripción de la imagen aquí

cin.getline

istream&getline(char name[],int size,char endchar='\n')
可以实现输入特定长度的字符串,若超过特定长度则只取符合长度的,若不超过可用\n控制结束

#include <bits/stdc++.h>

using namespace std;

int main()
{
    char a[100];
    cin.getline(a,100);
    printf("%s",a);

    return 0;
}

Festival de bucle

Encuentra el último dígito de n ^ n, encuentra el período regular

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int a[10][4]={{0},{1},{6,2,4,8},{1,3,9,7},{6,4},{5},{6},{1,7,9,3},{6,8,4,2},{1,9}};
     long int n,x,y;
    while(scanf("%ld",&n)>0)
    {
        while(n--)
        {
            scanf("%ld",&x);
            y=x%10;
            if(y==0||y==1||y==5||y==6)
            {
                printf("%d\n",y);
            }
            else if(y==4||y==9)
            {
                printf("%d\n",a[y][x%2]);
            }
            else
            {
                printf("%d\n",a[y][x%4]);
            }
        }
    }


    return 0;
}

Exponenciación rápida

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int i,n,t;
    while(scanf("%d",&n)>0)
    {

        while(n--)
        {
            int s=1;
            scanf("%d",&t);
            for(i=1;i<=t;i++)
            s=(s*(t%10))%10;
            printf("%d\n",s);
        }
    }

    return 0;
}

Encuentra n! Dígitos

El número de dígitos en un número n se puede expresar por lg (n) +1

#include <bits/stdc++.h>

using namespace std;

int main()
{
    long int i,n;
    while(scanf("%ld",&n)>0)
    {
        double sum=0.0;
        for(i=2;i<=n;i++)
        {
            sum=sum+log10(i);
        }
        printf("%ld\n",(long int)sum+1);
    }

    return 0;
}

Encuentra el número más a la izquierda de n ^ n

Inserte la descripción de la imagen aquí

#include <bits/stdc++.h>

using namespace std;

int main()
{
    long int n,t;
    double x=0.0;
    while(scanf("%ld",&n)>0)
    {
        while(n--)
        {
            scanf("%ld",&t);
            x=t*log10(double(t));
            x=x-(long long)x;
            x=(int)pow(10,x);
            printf("%.0lf\n",x);
        }
    }

    return 0;
}

ordenar

Archivo de encabezado: algoritmo.h
Complejidad: n * log (n)
Orden ascendente: sort (a, a + n, less <data-type> ())
Orden descendente: sort (a, a + n, mayor <data-type> ())

Festival de bucle

nefu-67

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int f[101],a,b,n,i;
    while(cin>>a>>b>>n)
    {
        f[1]=1;
        f[2]=1;
        if(a==0&&b==0&&n==0)
        break;
        if(n<3)
        cout<<"1"<<endl;
        else
        {
            for(i=3;i<=49;i++)//自动找出循环节
            {
                f[i]=(a*f[i-1]+b*f[i-2])%7;
                if(f[i]==1&&f[i-1]==1)
                break;
            }
            n=n%(i-2);//注意下标
            if(n==0)
            cout<<f[i-2]<<endl;
            else
            cout<<f[n]<<endl;
        }
    }
    return 0;
}

nefu-519

f (n) = 1 ^ 2 + 2 ^ 2 +… + n ^ n = (1/6) * n * (n + 1) (2 n + 1)

#include <bits/stdc++.h>

using namespace std;

int main()
{
    long long n,ans,t;
    while(cin>>n)
    {
        t=n*(n+1)/2;//两个连续整数相乘必是一奇一偶,一定可以被二整除
        if(t%3==0)
        {
            t=t/3;
            ans=(t%1007)*((n*2+1)%1007);
            ans=ans%1007;
        }
        else//因为最后结果一定是整数,所以如果t不能被三整除那么2*n+1一定可以
        {
            ans=(2*n+1)/3;
            ans=ans%1007;
            ans=(t%1007)*ans;
            ans=ans%1007;
        }
        cout<<ans<<endl;
    }
    return 0;
}

nefu-763

Hay varios ceros al final de n !, porque 2 * 5 = 10, así que encuentra el logaritmo de 2,5, y porque el número de 5 es pequeño, ¡encuentra n! El número de 5.
Ejemplo: 100
100/5 = 20 significa que hay 20 números divisibles antes de
100 100/5/5 = 4 significa que hay 4 números que son divisibles por 25 antes de 100, y 25 se pueden descomponer en dos 5

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n,ans;
    while(cin>>n)
    {
        ans=0;
        while(n)
        {
            n=n/5;
            ans+=n;
        }
        cout<<ans<<endl;

    }
    return 0;
}

nefu-901

#include <bits/stdc++.h>

using namespace std;

int main()
{
    double a[100001];
    int n;
    double s1,s2;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    scanf("%lf",&a[i]);
    sort(a,a+n);
    while(scanf("%lf %lf",&s1,&s2)>0)
    {
        int ans=upper_bound(a,a+n,s2)-lower_bound(a,a+n,s1);
        printf("%d\n",ans);
    }
    return 0;
}

¡Los lugares propensos a errores
Int ans = lower_round (a, a + n, x)
están equivocados!
La redacción correcta:
Int ans = lower_round (a, a + n, x) -a;
porque lower_round () devuelve un puntero, no un int

Dicotomía

nefu-899

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n,k,ans,l,r,mid;
    while(scanf("%d %d",&n,&k)>0)
    {
        ans=0;l=1;r=n;
        while(l<=r)
        {
            ans++;
            mid=(l+r)/2;
            if(mid==k)
            break;
            if(mid<k)
            l=mid+1;
            if(mid>k)
            r=mid-1;
        }
        printf("%d\n",ans);

    }
    return 0;
}

Publicado 9 artículos originales · me gusta 0 · visitas 224

Supongo que te gusta

Origin blog.csdn.net/zmsjylyf/article/details/105351878
Recomendado
Clasificación