1. 程式人生 > 其它 >CF177A1/A2 Good Matrix Elements 題解

CF177A1/A2 Good Matrix Elements 題解

CF177A1/A2 Good Matrix Elements 題解

Content

給定一個 \(n\times n\) 的矩陣,每個元素都有一個值,求出處於兩條對角線以及中間行和中間列的元素之和。

資料範圍:\(1\leqslant n\leqslant 5(\text{A1})/100(\text{A2})\)

Solution

前置知識:矩陣的主對角線即為左上到右下的對角線,副對角線即為左下到右上的對角線。

我們先觀察處於題目中所要求的位置上的元素有哪些特徵,以題目中給出的圖為例:

設元素的位置為 \((i,j)\),我們發現,主對角線上的元素滿足 \(i=j\),副對角線上的元素滿足 \(i+j=n+1\),中間行的所有元素的行數都是 \(\left\lfloor\dfrac n2\right\rfloor+1\)

,中間列的所有元素的列數都是 \(\left\lfloor\dfrac n2\right\rfloor+1\)

因此,我們輸入完 \(n\) 之後先把滿足上述條件的所有元素的集合,也就是 \(\{(i,j)\mid i=j\text{ 或 }i+j=n+1\text{ 或 }i=\left\lfloor\dfrac n2\right\rfloor+1\text{ 或 }j=\left\lfloor\dfrac n2\right\rfloor+1\}\) 全部標記一下,輸入每個元素的值的時候再把所有標記了的元素加進答案裡面即可。

Code

int n, a[107][107], flag[107][107], ans;

int main() {
	n = Rint;
	F(i, 1, n) flag[i][i] = flag[i][n - i + 1] = flag[n / 2 + 1][i] = flag[i][n / 2 + 1] = 1;
	F(i, 1, n) F(j, 1, n) ans += flag[i][j] * (a[i][j] = Rint);
	return printf("%d", ans), 0;
}