Zusammenfassung der Blue Bridge Cup-Wissenspunkte C++

Inhaltsverzeichnis

1. Gewalt, Aufzählung

2. Datumsausgabe

① Beurteilung des Schaltjahres

②Beurteilen Sie, ob das Datum angemessen ist

③Berechnung mit Hilfe von Excel 

3. Nummernverarbeitung

① Einfaches Sieb

1. Einfaches einfaches Sieb:

2. Esperanto-Sieb

②Größter gemeinsamer Teiler (euklidisch)

1. Einzelnummer:

2. Mehrere Nummern:

(3) Kleinstes gemeinsames Vielfaches

1. Einzelnummer:

2. Mehrere Nummern:

④ zwei Punkte

4. dp——01 Rucksack

5. Suchen

①dfs

6. Häufig verwendete Funktionen in C++

①Sortierfunktion Sortierfunktion

②Initialisierungsfunktion memset

③Mathematische Funktionen

7. Saite


1. Gewalt, Aufzählung

In der Regel mehrere Schleifen, achten Sie auf Grenzen und Ausgänge

2. Datumsausgabe

① Beurteilung des Schaltjahres

int check(int x)
{    
    if(x%400==0||(x%4==0&&x%100!=0)
    return 1;
    return 0;
}

②Beurteilen Sie, ob das Datum angemessen ist

int check(int year,int month,int day)
{
    int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    if(year%4==0&&year%100!=0||year%400==0)//闰年判断
        a[2]+=1;
    if(month<1||month>12)//判断月份是否出界 
        return 0;
    int t=a[month];
    if(day<1||day>t)
        return 0;
    return 1;
}

③Berechnung mit Hilfe von Excel 

3. Nummernverarbeitung

① Einfaches Sieb

1. Einfaches einfaches Sieb:

int prime(int n)
{
    if(n==1)
    return 0;
    for(int i=2;i*i<n;i++)
    {
        if(n%i==0)return 0;
    }
    return 1;
}

2. Esperanto-Sieb

Idee: Markieren Sie ausgehend von 2 die Vielfachen jeder Primzahl als zusammengesetzte Zahl

int a[MAXN];
void prime()
{
    memset(a,1,sizeof(a);  //初始化为都是素数 
    a[0]=a[1]=0;//0和1不是素数 
    for(int i=2;i<=MAXN;i++)
    {
        if(a[i])
        {
            for(int j=i*i;j<MAXN;j=j+i)
            a[j]=0;//i的倍数都不是素数 
        }
    }
}

②Größter gemeinsamer Teiler (euklidisch)

因为a / b = k(余r)
所以 a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),
则r = a mod b假设d是a,b的一个公约数,
则 a%d == 0, b%d == 0而r = a - kb,
两边同时除以d,r/d=a/d-kb/d=m,
由等式右边可知m为整数,因此r%d==0而r=a mod b,
因此d也是b,a mod b的公约数假设d是b,a mod b的公约数,
则b%d == 0,(a-k*b)%d == 0(a − k ∗ b a-k*ba−k∗b)%d = a%d-k∗ *∗b%d == 0 ,
k是一个整数。进而a%d == 0.
因此d也是a,b的公约数因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等

1. Einzelnummer:

int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

2. Mehrere Nummern:

int gcds(int a[],int n)
{
    int g=a[0];
    for(int i=1;i<n;i++)
    {
        g=gcd(g,a[i]);
    }
    return g;
}

(3) Kleinstes gemeinsames Vielfaches

Das kleinste gemeinsame Vielfache zweier Zahlen ist gleich ihrem Produkt dividiert durch den größten gemeinsamen Teiler (a*b/ggT(a,b))

1. Einzelnummer:

int lcm(int a,int b)
{
    return a*b/gcd(a,b);
}

2. Mehrere Nummern:

int lcms(int a[],int n)
{
    int l=a[0];
    for(int i=1;i<n;i++)
    {
    l=lcm(a[i],l);
    }
    return l;
}

④ zwei Punkte

int i=0,j=100001;//所给范围 
while(i<=j)
{
    int mid=(i+j)/2;//二分法将mid看作边长 
    if(check(mid))//假如已经符合就继续往上查找 
        i=mid+1;//找到符合题意的最大边长 
    else 
        j=mid-1;//往下查找 
}

4. dp——01 Rucksack

bekannte Zustände

① Es gibt N Gegenstände und einen Rucksack. Das Fassungsvermögen des Tornisters beträgt V.

② Für jeden Artikel: Volumen, Wert

③Jeder Artikel kann nur einmal verwendet werden


Zwei Bedingungen müssen erfüllt sein


①Das Gesamtvolumen der ausgewählten i Artikel überschreitet nicht V
②Der Wert dieser Artikel summiert sich zum größten
③Für einen bestimmten Artikel: verwenden/nicht verwenden

analysieren:

Wenn Sie es nicht nehmen, gibt es j Platz für i-1 Gegenstände

Wenn Sie es nehmen, müssen Sie nur den Platz von jc[i] den i-1 Elementen und den Platz von c[i] dem i-ten Element zuweisen

Der Gesamtwert, der durch die Zuweisung von jc[i]-Speicherplatz und die Zuweisung von j-Speicherplatz zu i-1 Elementen erzielt wird, ist unterschiedlich

#include<bits/stdc++.h>//万能头文件
#define ll long long
using namespace std;
const ll maxn=100;
ll n,v,f[maxn][maxn];
ll c[maxn];//每个物品占用空间
ll w[maxn];//每个物品的价值
int main()
{
    cin>>n>>v;
    for(ll i=1;i<=n;i++)
        scanf("%lld",&c[i]);
    for(ll i=1;i<=n;i++)
        scanf("%lld",&w[i]);
    for(ll i=1;i<=n;i++)//第i个物品
        for(ll j=v;j>=0;j--)//剩余空间j
        { 
           if(j >= c[i])//如果装得下 
                   f[i][j]=max( f[i-1][j-c[i]]+w[i],f[i-1][j]);
            else//如果装不下
                f[i][j]=f[i-1][j];
        }
    cout<<f[n][v]<<endl;//输出答案 
}

5. Suchen

①dfs

void dfs(int x,int y)
{
    if(x==fx&&y==fy)//出口
    {
    sum++;return ; 
    }
    for(int i=0;i<4;i++)
    {
        int nx=x+s[i][0];
        int ny=y+s[i][1];
        if(nx<1||nx>n||ny<1||ny>m||mp[nx][xy]==1||vis[nx][ny]==1)
            continue;//边界条件以及是否有障碍或已走过 
        vis[nx][ny]=1;//标记走过 
        dfs(nx,ny);//递归 
        vis[nx][ny]=0//回溯 
    }
} 

6. Häufig verwendete Funktionen in C++

①Sortierfunktion Sortierfunktion

sortieren(a,a+num)

②Initialisierungsfunktion memset

memset(a,0,sizeof(a));

③Mathematische Funktionen

1., abs - Finden Sie den absoluten Wert einer ganzen Zahl  

2. pow——Ermitteln Sie die Potenz von x

3, sqrt - Berechne die Quadratwurzel

7. Saite

Gängige Methoden der String-Klasse - Turbo Summer Soseki's Blog - CSDN Blog

Guess you like

Origin blog.csdn.net/qq_62799214/article/details/124025251