Codeforces Round #511 Div2 D. Little C Loves 3 II

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;
}

总结

遇到不是很好想的数学题可以先打个表。

猜你喜欢

转载自www.cnblogs.com/hfccccccccccccc/p/9780744.html