演算法講演錄[1]

halfah發表於2024-08-31

準備

線上測評系統

Codeforces是一個提供線上評測系統的俄羅斯網站。截止2023年,該網站已經擁有超過2,000,000的註冊使用者。

AtCoder是日本最大的演算法競技網站。提供程式設計線上比賽、過往比賽提交、線上評測等服務。

準備工作

  1. 安裝Code::Blocks

  2. 安裝Edge瀏覽器。

  3. 安裝瀏覽器擴充套件——篡改猴

  4. 安裝指令碼Atcoder Better!

認識程式

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll a,b;
	cin >> a >> b;
	cout << a+b;
	return 0;
}

程式功能:輸入兩個整數,程式會輸出這兩個整數的和。

整數

輸出整數

cout << 整數;

使用整數表示式

  • +

  • -

  • *

  • 除(向下取整)/(表達向下取整含義時,除數不能是負數,被除數必須是正數)

優先順序:先乘除,後加減。括號()可以改變運算順序。

*不等式的性質

性質1:不等式兩邊加同一個數,不等號的方向不變.

\(a>b\),則\(a+c>b+c\)

性質2:不等式兩邊乘同一個正數,不等號的方向不變.

\(a>b\)\(c>0\),則\(ac>bc\)

性質3:不等式兩邊乘同一個負數,不等號的方向改變.

\(a>b\)\(c<0\),則\(ac<bc\)

*整數除法

a除以b向下取整寫作\(\lfloor \frac{a}{b} \rfloor\),表示小於等於\(\frac{a}{b}\)的整數中最大的一個。

a除以b向上取整寫作\(\lceil \frac{a}{b} \rceil\),表示大於等於\(\frac{a}{b}\)的整數中最小的一個。

*一些結論:

  1. \(x\)為整數且\(x\le\frac{a}{b}\),則\(x\)的取值範圍為\(x\le\lfloor\frac{a}{b}\rfloor\)

  2. \(x\)為整數且\(x\ge\frac{a}{b}\),則\(x\)的取值範圍為\(x\ge\lceil\frac{a}{b}\rceil\)

  3. \(x\)為整數,則\(\lfloor\frac{a}{b}+x\rfloor=\lfloor\frac{a}{b}\rfloor+x\)\(\lceil\frac{a}{b}+x\rceil=\lceil\frac{a}{b}\rceil+x\)

  4. 若a為非負整數且b為正整數,則\(\lceil\frac{a}{b}\rceil=\lfloor\frac{a+b-1}{b}\rfloor\)

整數變數

宣告一個整數變數:

long long 變數名;

如果在main()前面加上typedef long long ll;,可以用下面的程式碼宣告一個整數變數:

ll 變數名;

宣告多個變數:

ll 變數名1,變數名2,變數名3,...,變數名n;

變數名的規則:

  1. 識別符號不能是關鍵字。
  2. 識別符號只能由字母、數字和下劃線字元組成。
  3. 識別符號必須以字母或下劃線開頭。不能以數字開頭。
  4. 區分大小寫。

識別符號:使用者程式設計時使用的名字。

練習:判斷以下識別符號是否可以作為變數名

hello

3d

_0_0_

long

LoNg

對整數變數進行賦值:

變數名=整數;

宣告整數變數的同時可以對其進行賦值:

ll 變數名=整數;

宣告多個變數同理:

ll 變數名1=整數,變數名2=整數,變數名3=整數,...,變數名n=整數;

練習:閱讀程式,給出程式的輸出結果

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll a=1,b=2;
    cout << a+b*3+4;
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll a=3,b=4,c=0;
    c=a;
    a=b;
    b=c;
    cout << a*2+b;
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    ll a=1,b=1;
    ll c=a+b;
    a=b+c;
    b=c+a;
    c=a+b;
    a=b+c;
    a=a+10;
    cout << a;
	return 0;
}

輸入整數

cin >> 整數變數;

例題:輸入兩個整數a,b,輸出它們的和。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll a,b;
	cin >> a >> b;
	cout << a+b;
	return 0;
}

abc178a-Not

abc198a-Div

abc172a-Calc

abc302a-Attack

abc262a-World Cup

abc173a-Payment

取模

計算\(a(a\ge 0)\)除以\(b(b>0)\)的餘數:

a%b

也可以表示為\(a-\lfloor\frac{a}{b}\rfloor\cdot b\)

a-a/b*b

abc254a-Last Two Digits

abc235a-Rotate

abc227a-Last Card

條件判斷

布林型別

布林型別的取值有兩種:

  • true 表示真,數值為1。

  • false 表示假,數值為0。

宣告一個布林變數:

bool 變數名;

給布林變數賦非零值時,會轉為true(1)。

關係運算子

== 等於

!= 不等於

> 大於

< 小於

>= 大於等於

<= 小於等於

當條件為真時,返回true(1),否則返回false(0)。

邏輯運算子

&& 且:運算元均為true時,結果為true,否則為false。

*並且:用於連線並列的形容詞等,表示同時存在。

|| 或:運算元均為flase時,結果為false,否則為true。

*或者:用在敘述句裡,表示選擇關係。

! 非(只有一個運算元):運算元為true時,結果為false;運算元為false時,結果為true。

條件的表達

x大於5且x小於等於9

x>5&&x<=9

x大於等於8或x小於3

x>=8||x<3

練習:

  • x與y的和是正數且x與y的積是負數

  • x在10到20之間,或者在30到40之間

  • x和y中至少有一個3的倍數,並且x+y和x*y中至少有一個是4的倍數

  • x年是閏年

閏年:能被4整除且不能被100整除,或者能被400整除。

if語句

if(條件){
    語句;
    語句;
    ...
    語句;
}else{
    語句;
    語句;
    ...
    語句;
}

當條件為真(true)時,程式會執行if大括號內的語句,否則執行else大括號內的語句。

如果只有一條語句,可以簡寫為:

if(條件)語句;
else 語句;

若想在條件為假(false)時不執行語句,可以將else省略。

常用函式

得到兩個數的最大值

max(數,數)

得到多個數的最大值

max({數,數,...,數})

得到兩個數的最小值

min(數,數)

得到多個數的最小值

min({數,數,...,數})

交換兩個變數的值

swap(變數名,變數名)

求一個數的絕對值

abs(數)

實數\(x\)的絕對值,記為\(\left|x\right|\)

\( |x|= \begin{cases} x&x>0\\ 0&x=0\\ -x&x<0\\ \end{cases} \)

輸出字串

cout << 字串;

由雙引號包裹的內容為字串,如"yes""no"

三元運算子

條件?X:Y

如果滿足條件,表示式的值為X,否則為Y。

yes or no

例題:abc223a-Exact Price

使用if:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll x;
	cin >> x;
	if(x%100==0&&x>0)cout << "Yes";
	else cout << "No";
	return 0;
}

使用三元運算子:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll x;
	cin >> x;
	cout << (x%100==0&&x>0?"Yes":"No");
	return 0;
}

abc253a-Median?

abc228a-On and Off

abc309a-Nine

abc240a-Edge Checker

判斷結果

abc243a-Shampoo

abc245a-Good morning

abc249a-Jogging

分類討論

abc250a-Adjacent Squares

abc214a-New Generation ABC

abc259a-Growth Record

abc331a-Tomorrow

abc355a-Who Ate the Cake?

abc305a-Water Station

abc233a-10yen Stamp

<題單1-1>

abc326a-2UP3DOW

abc352a-AtCoder Line

abc343a-Wrong Answer

abc318a-Full Moon

<題單1-2>

abc269a-Anyway Takahashi

abc334a-Christmas Present

abc212a-Alloy

abc219a-AtCoder Quiz 2

迴圈

數學知識補充:等差數列

換行

cout << endl;

也可以使用跳脫字元\n

cout << '\n';

自增和自減

將變數的值+1

變數名++

或者

++變數名

同理,將變數的值-1

變數名--

或者

--變數名

將變數的值+n

變數名+=n

同理,將變數的值-n

變數名-=n

i++和++i的區別(i--和--i同理):

i++是先賦值,然後再自增;++i是先自增,後賦值。
用程式碼表示就是:
若 a = i++; 則等價於 a=i;i=i+1;
而 a = ++i; 則等價於 i=i+1;a=i;

while迴圈

while(條件){
    語句;
    語句;
    ...
    語句;
}

當條件滿足時,會反覆執行大括號內的語句。

練習(使用while迴圈):

  • 無限輸出hello

  • 輸出10次hello

  • 按順序輸出1到100的所有數

  • 按順序輸出100到1的所有數

  • 從小到大輸出1到100的所有是7的倍數的奇數

for迴圈

for(初始化語句;條件;主體結束執行語句){
    語句;
    語句;
    ...
    語句;
}

for迴圈開始前會執行初始化語句

在滿足條件時,迴圈會一直執行大括號內的語句。

每執行完一次大括號內的語句時,會執行一次主體結束執行語句

初始化語句條件主體結束執行語句均可以省略,省略條件時,迴圈會一直進行下去。

練習(使用for迴圈):

  • 無限輸出hello

  • 輸出10次hello

  • 按順序輸出1到100的所有數

  • 按順序輸出100到1的所有數

  • 從小到大輸出1到100的所有是7的倍數的奇數

迴圈控制語句

退出當前迴圈:

break;

跳過此次迴圈的剩餘部分:

continue;

變數的作用域

區域性變數:在函式或一個程式碼塊內部宣告的變數。只能被函式內部或者程式碼塊內部的語句使用。

全域性變數:在所有函式外部定義的變數。全域性變數的值在程式的整個生命週期內都是有效的。

宣告全域性變數時,變數的初始值為0。

重複

abc288a-Many A+B Problems

abc283a-Power

abc320a-Leyland Number

abc221a-Seismic magnitude scales

abc238a-Exponential or Quadratic

列舉

abc281a-Count Down

abc340a-Arithmetic Progression

陣列

陣列可以用來宣告多個相同型別的變數

宣告\(N\)個整數變數的方法:

ll 陣列名[N];

宣告\(N\)個布林變數同理:

bool 陣列名[N];

用以上方法宣告陣列後,可以使用的變數為:

陣列名[0]陣列名[1]陣列名[2]、...、陣列名[N-2]陣列名[N-1],共\(N\)個變數。

注意:這裡的\(N\)是常量,不能是變數。

常量:在程式執行期間不會改變的固定值。

整數常量的宣告:

const ll 常量名=整數;

案例:輸入正整數\(n\),以及\(n\)個整數:\(a_1,a_2,a_3,...,a_n\)。將它們倒序輸出(兩個數之間用空格隔開)。

ll n,a[N];
cin >> n;
for(ll i=1;i<=n;i++)cin >> a[i];
for(ll i=n;i>=1;i--)cout << a[i] << " ";

陣列和

abc272a-Integer Sum

abc351a-The bottom of the ninth

abc349a-Zero Sum Game

abc337a-Scoreboard

abc332a-Online Shopping

存在尋找

abc353a-Buildings

abc317a-Potions

abc300a-N-choice question

abc277a-^{-1}

abc313a-To Be Saikyo

資料過濾

abc347a-Divisible

abc294a-Filter

加工計算

abc346a-Adjacent Product

abc290a-Contest Result

abc307a-Weekly Records

abc330a-Counting Passes

陣列操作

abc278a-Shift

abc247a-Move Right

abc248a-Lacked Number

abc268a-Five Integers

abc263a-Full House

<題單1-3>

abc328a-Not Too Hard

abc297a-Double Click

abc275a-Find Takahashi

abc241a-Digit Machine

相關文章