演算法競賽小技巧

是轨迹呐發表於2024-08-16

快速求和

如果要讓你求得一個陣列裡所有數的和怎麼辦?

如果這樣寫:

int sum;
for(int i = 0; i < n; ++i){
	sum += a[i];
}
cout<<sum;

是不是感覺這很不優雅,而且如果是要在 if 等語句裡判斷時還得寫一半跳出來在外面寫一個 forsum 然後再判斷,大大降低了思維的連貫性。這時候我們可以採用 accumulate() 函式。

#include <numeric>
accumulate(起始迭代器,結束迭代器,初始值,自定義操作函式)

accumulate() 可以對指定可迭代序列進行有初始值的求和,如果加上自定義操作函式還可以求積求差之類的。例如:

#include <iostream>
#include <numeric>
using namespace std;
int main(){
	int a[] = {1, 2, 3, 4, 5};
	cout << (accumulate(a, a + 5, 0));	//輸出 15
	return 0;
}

除了拿來求和,轉變一下思路還可以拿來判斷一些別的東西。

在藍橋杯2016年國賽中有一道叫做“路徑之謎”的題,其中要判斷 col[]row[] 陣列內每一項是否都為零,這裡陣列每一項都是非負整數,如果我們知道這個函式,那麼就可以很優雅地寫出如下程式碼:

if(accumulate(col, col+n, 0) == 0 && accumulate(row, row+n, 0) == 0){
	return true;
}

相關文章