http://codeforces.com/contest/1047/problem/D
问题
有一个 \(N \times M\) 的棋盘,每次可以选择两个曼哈顿距离为 \(3\) 的未被占领的点,并在这两个点上放置棋子。问最多能放多少个旗子。
题解
建图跑了一下最大流会发现基本都可以跑满,只有部分小数据跑不满,特判一下就好了。。。
#include <bits/stdc++.h>
#ifdef LOCAL
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define debug(...) 0
#endif
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int, int> pii;
int main() {
ll n, m;
while (cin >> n >> m) {
if (n > m) swap(n, m);
ll ans = 0;
if (n == 1) {
ll r = m % 6;
ans = ((m - r) / 6) * 3;
if (r == 4) ans += 1;
if (r == 5) ans += 2;
ans *= 2;
} else if (n == 2 && (m == 2 || m == 3 || m == 7)) {
if (m == 2) ans = 0;
if (m == 3) ans = 4;
if (m == 7) ans = 12;
} else {
ans = n * m - (n * m % 2);
}
cout << ans << endl;
}
return 0;
}
总结
遇到不是很好想的数学题可以先打个表。
原文地址:https://www.cnblogs.com/hfccccccccccccc/p/9780744.html
时间: 2024-10-13 14:26:26