迷わないように気をつけて、たくさんの人に勧めてください
目次
1.1 同期をキャンセルする (時間を節約し、チート ポイントも節約できます。すべてのプログラムを作成するのが最善です)
1.2 ユニバーサル ライブラリ (コンパイル時間が遅くなる可能性がありますが、頭を節約できます)
1.3 ブルーブリッジカップのリターン0を忘れずに書きましょう!!
2.6.3 完全なナップザック問題 (各アイテムの数は無限)
3.6 コレクション (セット) (要素の繰り返しは必要ありません)
1トリック
1.1 同期をキャンセルする (時間を節約し、チート ポイントも節約できます。すべてのプログラムを作成するのが最善です)
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
1.2 ユニバーサル ライブラリ (コンパイル時間が遅くなる可能性がありますが、頭を節約できます)
#include <bits/stdc++.h>
1.3 ブルーブリッジカップのリターン0を忘れずに書きましょう!!
1.4 コンパイル設定 (開発 C++)
(1) Tools -> Compilation Options -> Compiler -> コンパイル時に以下のコマンドを追加 -> 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 時間の複雑さ
Blue Bridge Cup の各問題のコンパイル時間は 1 秒未満に制限されています. 比較的大きなデータを含む問題に遭遇した場合, 多くの場合、時間の複雑さを減らす必要があります.
概算では、O(n) の場合は 1 秒間に約 4 億回、O(n*n) の場合は 1 秒間に約 20,000 回、O( n*n*n)。
Blue Bridge Cup の評価システムは合格サンプル数に基づいているため、問題を行う際にはサンプルの値の範囲に注意する必要があります。
例: K 倍間隔 (ブルート フォース法では一部のサンプルしか渡すことができないため、より適切なアルゴリズムを使用する必要があります)
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 のアドレスと同様)
モデル: find (始点を見つける、終点を見つける、ターゲット要素を見つける)
同様に、検索間隔は [開始点を検索、終了点を検索] です。
#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 (幅優先検索)
キューが使用されます (プライオリティ キューが使用される場合もあります)
主なアイデア: すべての適格なポイントをキューにプッシュし、1 つずつポップアップして、キューが空になるまで、検索が完了したことを意味する、上、下、左、右、前、後ろを検索します。検索されたかどうかの判断に注意し、bool vis【】で判断します。
トピック例: 地球温暖化
(1 メッセージ) 地球温暖化 (Lanqiao Cup 2018 省大会グループ B テスト問題 I) (C/C++)_Caizhiyin のブログ - CSDNブログ
2.2 DFS (深さ優先検索)
再帰を使用する (わかりにくい)
メイン テンプレート: 以下の完全な配置例を参照してください
要約すると、次の手順があります。
(1) () が返される場合、境界を決定します。
(2) forループに入る
(3) 検索したかどうかを判断 if (vis[]) vis[]=true; dfs(); vis[]=false;
例:計算式
2.3 最大公約数と最小公倍数
最大公約数(gcd)
#include <bits/stdc++.h>
using namespace std;
int main()
{
cout<<__gcd(25,5);
return 0;
}
最小公倍数 (lcm)
もう 1 つ 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 媒体としての 10 進数 (一般的なタイプ)
2.4.2 媒体としてのバイナリ (トリック タイプ)
2.5 バイナリ表現
例:退屈で面白い
(メッセージ数 8)蘭橋杯の試験問題のアルゴリズムトレーニングがつまらない (C/C++)_C のブログのせいでクッキング - CSDN ブログ
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) 金貨を取る (Lanqiao Cup Algorithm Training) (C/C++)_ Caizhicaiのブログ - CSDN ブログ
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.12 ソート
3 STL
3.1 待ち行列(待ち行列)
3.2 連結リスト (リスト)
3.3 プライオリティ キュー(プライオリティ キュー)
プライオリティ キューはデフォルトで大きなルート ヒープ (大きいものから小さいものへの並べ替え) に設定されます。小さいものから大きいものへ並べ替えたい場合は、
<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 に参加するために習得する必要がある知識ポイントとスキルの一般的なリストを以下に示します.特定の知識ポイントについて詳しく知りたい場合は、私のサンプル問題や他の人の記事を読むことができます.