原题链接:Codeforces Round #609 (Div. 1) B. Domino for Young
题目相关数学知识请参见这里(看不用付费的部分,学会染色法就够了)
(又见Matrix67大佬,不过和这题稍微有点不同)
给相邻的格子分别图上白色和黑色,计算有多少白色与黑色的格子,取min就是答案(多米诺一定要占据1个黑格子和1个白格子)
/**
* author: tourist
* created: 21.12.2019 14:08:24
**/
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
//cnt[0]计算白格子的数量,cnt[1]计算黑格子的数量
//假设偶数列以黑格子开始,奇数列以白格子开始(从下往上数)
//(黑白全都倒一下也一样)
vector<long long> cnt(2, 0);
for (int i = 0; i < n; i++) {
cnt[i % 2] += a[i] / 2; //偶数列白格子个数为格子数/2,奇数列黑格子数为格子数/2
cnt[(i + 1) % 2] += (a[i] + 1) / 2;//偶数列黑格子为格子数/2后向上取整,奇数列白格子数为格子数/2向上取整
}
cout << min(cnt[0], cnt[1]) << '\n';//取min获得答案
return 0;
}
不错,学习了,向大佬学习
他为什么不用scanf 而是用cin
因为这里输入输出比较小在10^5以下,scanf和cin造成的读取速度差异没有那么明显。另外这是个拼手速的比赛,同分的情况下按提交时间排名,cin明显打起来比scanf快。