블루브릿지컵(C/C++) 핵심 포인트 (수시 업데이트)

길을 잃지 않도록 주의하세요. 더 많은 사람들에게 추천하는 것을 환영합니다.

목차

트릭 1개

1.1 동기화 취소(시간 절약, 치트 포인트, 모든 프로그램을 작성하는 것이 가장 좋습니다)

1.2 범용 라이브러리(컴파일 시간이 지연될 수 있지만 두뇌를 절약할 수 있음)

1.3 Blue Bridge Cup의 리턴 0을 쓰는 것을 잊지 마십시오! !

1.4 컴파일 설정(Dev C++)

1.5 memset 충전 기능

1.6 시간 복잡도

1.6.1 상수 차수 O(1)

1.6.2 로그 차수 O(logn)

1.6.3 선형차수 O(n)

1.6.4 선형 대수 차수 O(nlogn)

1.6.5 다중 루프 O(n^k)

1.7 가지치기

1.8 찾기 기능

2 기본 알고리즘 및 기술

2.1 BFS(폭 우선 탐색)

2.2 DFS(깊이 우선 탐색)

2.3 최대공약수와 최소공배수

2.4 이진 변환

2.4.1 매체로서의 십진법(공통형)

2.4.2 매체로서의 바이너리(트릭 유형)

2.5 이진 표현

2.6 배낭 문제

2.6.1 01 배낭 문제

2.6.2 다중 배낭 문제(각 항목의 여러 항목)

2.6.3 완전한 배낭 문제(각 항목의 무한 개수)

2.7 동적 프로그래밍(DP)

2.8 탐욕

2.9 분할 정복(나중에 업데이트됨)

2.10 숫자를 배열로 나누기

2.11 숫자와 문자열의 상호화

2.12 정렬

3 STL

3.1 대기열(대기열)

3.2 연결 리스트(리스트) 

 3.3 우선순위 큐(priority queue)

3.4 벡터/동적 배열(벡터)

 3.5 스택(스택)

3.6 컬렉션(집합)(반복되는 요소가 필요하지 않음)

 3.7 컬렉션/맵/키-값 쌍(맵)

3.8 반복자


트릭 1개

1.1 동기화 취소(시간 절약, 치트 포인트, 모든 프로그램을 작성하는 것이 가장 좋습니다)

ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

1.2 범용 라이브러리(컴파일 시간이 지연될 수 있지만 두뇌를 절약할 수 있음)

#include <bits/stdc++.h>

1.3 Blue Bridge Cup의 리턴 0을 쓰는 것을 잊지 마십시오! !

1.4 컴파일 설정(Dev C++)

(1) 도구 -> 컴파일 옵션 -> 컴파일러 -> 컴파일 시 다음 명령어 추가 -> C99로 조정

 (2) 도구 -> 컴파일 옵션 -> 코드 생성/최적화 -> 코드 생성 -> 언어 표준

1.5 memset 충전 기능

메모리 블록을 바이트 단위로 초기화합니다. 0 또는 -1만 채울 수 있습니다.

#include <bits/stdc++.h>
using namespace std;
int a[10];
int main()
{
	memset(a,-1,sizeof(a));
	for(int i=0;i<10;i++)
	{
		cout<<a[i]<<endl;
	}
	return 0;
}

1.6 시간 복잡도

블루브릿지컵에서 각 문제의 컴파일 시간은 1초 이내로 제한되어 있으며, 상대적으로 데이터가 많은 문제를 만났을 때 시간 복잡도를 줄여야 하는 경우가 많습니다.

O(n)의 경우 1초에 약 4억회, O(n*n)의 경우 1초에 약 20,000회, O(의 경우 약 700회 완료되는 것으로 대략 추정된다. n*n*n).

블루브릿지컵 평가 시스템은 합격 샘플 수를 기반으로 하기 때문에 질문을 할 때 샘플의 값 범위에 주의를 기울여야 합니다.

예: K-겹 간격(무차별 대입 방법은 일부 샘플만 통과할 수 있으므로 더 나은 알고리즘을 사용해야 함)

(메시지 1개) K-폴드 간격(2017년 제8회 블루브릿지컵 지방대회 B조 10번째 질문) (C/C++)_Caizhiyin's Blog-CSDN Blog https://blog.csdn.net/ m0_71934846/ 기사/세부 정보/128434135?spm=1001.2014.3001.5501

1.6.1 상수 차수 O(1)

int i=1;
int j=2;
int m=i+j;

1.6.2 로그 차수 O(logn)

int i=1;
while(i<n)
{
  i=i*2;
}

1.6.3 선형차수 O(n)

for(int i=0;i<n;i++)
{
  cout<<i<<endl;
)

1.6.4 선형 대수 차수 O(nlogn)

for(int m=1;m<n;m++)
{
  int i=1;
  while(i<n)
  {
    i=i*2;
  }
}

1.6.5 다중 루프 O(n^k)

k는 루프 레이어의 수입니다.

1.7 가지치기

질문을 할 때 얻을 수 없는 값은 컴퓨터가 계산하지 않도록 하세요. 시간을 절약하세요. 블루브릿지 컵에서 만나는 것들은 너무 번거로운 가지치기를 사용하지 않았고, 대부분 BFS에도 있습니다. 및 DFS.는 (bool vis)에 나타납니다.

1.8 찾기 기능

기능: 배열에서 요소의 첫 번째 발생 주소 찾기(0x의 주소와 유사)

모델: 찾기(시작점 찾기, 끝점 찾기, 대상 요소 찾기)

마찬가지로 검색 구간은 [시작점 찾기, 끝점 찾기]

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int a[10]={2,6,8,1,3,7,5,1,0,11};
	cout<<find(a+0,a+5,8)<<endl;//打印类似0x地址 
	cout<<find(a+0,a+5,8)-a<<endl;//打印数组【】内的序号 
	return 0;
}

1.9 PI 문제

PI=아탄(1.0)*4

2 기본 알고리즘 및 기술

2.1 BFS(폭 우선 탐색)

대기열이 사용됨(가끔 우선순위 대기열이 사용됨)

주요 아이디어: 모든 적격 포인트를 대기열에 넣은 다음 하나씩 팝업하여 대기열이 비워질 때까지 위, 아래, 왼쪽, 오른쪽, 앞뒤로 검색하여 검색이 완료되었음을 의미합니다. 검색 여부 판단에 주의하고 bool vis【】를 사용하여 판단합니다.

예제 주제: 지구 온난화

(1 메시지) 지구 온난화 (Lanqiao Cup 2018 지방 대회 그룹 B 시험 문제 I) (C/C++)_Caizhiyin's Blog-CSDN Bloghttps: //blog.csdn.net/m0_71934846/article/ details/128434254?spm=1001.2014.3001.5502

2.2 DFS(깊이 우선 탐색)

재귀 사용(이해하기 쉽지 않음)

기본 템플릿: 다음 전체 배치 예를 참조하십시오.

http://t.csdn.cn/ANnS1

요약하면 다음과 같은 단계가 있습니다.

(1) ()가 반환되면 경계를 결정합니다.

(2) for 루프를 입력합니다.

(3) if (vis[]) vis[]=true; dfs(); vis[]=false;

예: 계산 공식

(3개의 메시지) 계산 공식(Blue Bridge Cup 2016 Provincial Competition Group B의 세 번째 질문) (C/C++)_Caizhiyin's Blog-CSDN Bloghttps: //blog.csdn.net/m0_71934846/article/ details/128434004?spm= 1001.2014.3001.5502

2.3 최대공약수와 최소공배수

최대 공약수 (gcd)

#include <bits/stdc++.h>
using namespace std;

int main()
{
	cout<<__gcd(25,5);
	return 0;
}

최소공배수(lcm)

lcm 함수를 하나 더 작성하십시오.

#include <bits/stdc++.h>
using namespace std;

int lcm(int a,int b)
{
    return a*b/__gcd(a,b);
}
int main()
{
	cout<<lcm(25,5);
	return 0;
}

2.4 이진 변환

2.4.1 매체로서의 십진법(공통형)

(8개의 메시지) 모든 기수를 10진수로/10진수를 임의의 기수로 변환(ASCII 코드 방법) (C/C++ ) article/details/128297645?spm=1001.2014.3001.5502

2.4.2 매체로서의 바이너리(트릭 유형)

(메시지 2개) 16진수에서 8진수로 (Lanqiao Cup 기본 연습 C/C++) _ C의 블로그 때문에 요리만 - CSDN 블로그 https://blog.csdn.net/m0_71934846/article/details/128745875?csdn_share_tail =%7B%22type %22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128745875%22%2C%22source%22%3A%22m0_71934846%22% 7D

2.5 이진 표현

예: 지루하다 웃기다

(8개 메시지) Lanqiao Cup 시험 문제에 대한 알고리즘 교육은 지루합니다(C/C++)_Cooking because C's blog-CSDN 블로그 https://blog.csdn.net/m0_71934846/article/details/128717938?spm=1001.2014 .3001.5502

2.6 배낭 문제

2.6.1 01 배낭 문제

#include<bits/stdc++.h>

using namespace std;

int v[1000];    // 体积
int w[1000];    // 价值 
int f[1000][1000];  // f[i][j], j体积下前i个物品的最大价值 

int main() 
{
    int n, m;   
    cin >> n >> m;
    for(int i = 1; i <= n; i++) 
        cin >> v[i] >> w[i];

    for(int i = 1; i <= n; i++) 
        for(int j = 1; j <= m; j++)
        {
            //  当前背包容量装不进第i个物品,则价值等于前i-1个物品
            if(j < v[i]) 
                f[i][j] = f[i - 1][j];
            // 能装,需进行决策是否选择第i个物品
            else    
                f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
        }           

    cout << f[n][m] << endl;

    return 0;
}

2.6.2 다중 배낭 문제(각 항목의 여러 항목)

여러 항목을 새로운 항목으로 반죽하고 일련 번호에 따라 쌓아 두십시오.

2.6.3 완전한 배낭 문제(각 항목의 무한 개수)

#include<iostream>
using namespace std;
const int N = 1010;
int f[N];
int v[N],w[N];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i = 1 ; i <= n ;i ++)
    {
        cin>>v[i]>>w[i];
    }
 
    for(int i = 1 ; i<=n ;i++)
    for(int j = v[i] ; j<=m ;j++)
    {
            f[j] = max(f[j],f[j-v[i]]+w[i]);
    }
    cout<<f[m]<<endl;
}

2.7 동적 프로그래밍(DP)

예: 금화 가져가기

(1 메시지) Take Gold Coins (Lanqiao Cup Algorithm Training) (C/C++)_Caizhicai's Blog-CSDN Bloghttps://blog.csdn.net/m0_71934846/article/details/128456365?spm= 1001.2014 .3001.5502

2.8 탐욕

아이디어: 로컬 최적 솔루션을 선택하지만 경우에 따라 적용되지 않는 것이 가장 큰 결함입니다.

예: 지폐 문제

예를 들어 1위안, 2위안, 5위안, 10위안, 20위안, 50위안, 100위안의 액면가가 있는데 110위안을 욕심내어 가장 큰 액면가인 100위안부터 찾을 수 있습니다.

그러나 지폐의 액면가를 1위안, 2위안, 5위안, 20위안, 55위안, 100위안 등으로 바꾸면 그리디 알고리즘을 사용하면 최적의 솔루션을 찾을 수 없다는 것을 알게 됩니다(그리디: 100+5+5= 110 동적 프로그래밍: 55+55=110)

2.9 분할 정복(나중에 업데이트됨)

대부분 이분법적

2.10 숫자를 배열로 나누기

(2 메시지) 숫자를 분할하여 배열로 저장(C/C++ ) .3001.5501

2.11 숫자와 문자열의 상호화

하위 번호를 찾을 수 없지만 하위 문자열은 찾을 수 있습니다.

예: 초소수

(메시지 2개) 초소수(란교컵 C/C++ 알고리즘 대회)_차이지인의 블로그-CSDN 블로그https://blog.csdn.net/m0_71934846/article/details/128723978?csdn_share_tail=%7B % 22type%22%3A%22blog %22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128723978%22%2C%22source%22%3A%22m0_71934846%22%7D

2.12 정렬

(메시지 4개) 문자열에서 가장 큰 문자 찾기(빠른 세 가지 방법)_문자열에서 가장 큰 문자 찾기_Food only because of C's blog-CSDN 블로그 https://blog.csdn.net/m0_71934846/article/details /128457227?spm =1001.2014.3001.5501

3 STL

3.1 대기열(대기열)

3.2 연결 리스트(리스트) 

 3.3 우선순위 큐(priority queue)

 우선 순위 큐는 기본적으로 큰 루트 힙(큰 것에서 작은 것 순으로)으로 설정되어 있습니다. 작은 것에서 큰 것 순으로 정렬하려면

<int, vector<int>, greater<int> >//오름차순 정렬(작은 루트 힙)

<int,vector<int>,less<int> >//내림차순으로 정렬(큰 루트 힙)

3.4 벡터/동적 배열(벡터)

 3.5 스택(스택)

3.6 컬렉션(집합)  (반복되는 요소가 필요하지 않음)

set<int> s;//기본 오름차순

set<int, greater<int>> s2 = {3,2,5,1,4 ,3};//降序

설정값 수정 불가(수정 후 데이터 순서를 보장할 수 없음)

 3.7 컬렉션/맵/키-값 쌍(맵)

3.8 반복자

 주형:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v;
	v.push_back(11);
	v.push_back(7);
	vector<int>::iterator it = v.begin();
	
	while(it!=v.end())
	{
		cout << *it <<"  ";
		it++;
	}
	cout << endl;
	return 0;
}


다음은 Blue Bridge Cup에 참가하기 위해 마스터해야 하는 지식 포인트 및 기술에 대한 일반적인 목록입니다. 특정 지식 포인트에 대해 더 알고 싶다면 내 샘플 질문 및 다른 사람들의 기사를 읽을 수 있습니다.

Supongo que te gusta

Origin blog.csdn.net/m0_71934846/article/details/128721132
Recomendado
Clasificación