根据题意有四种方块,左右都白、左白右黑、左黑右白和左右都黑,其中黑与黑面连在一起可以认为是合成一块,那么求最少和最多就依据贪心的思想,最少肯定是尽可能的黑与黑碰在一起,最多肯定是尽可能地让黑与黑碰不到一起
最少的情况:优先把左右都黑的放在一起,然后最左边可以放一个左白右黑,最右边可以放一个左黑右白,然后考虑左白右黑和左黑右白,两块可以合成一块,剩下的左右都白只能单独
最多的情况:优先在左右都黑的两边放上左右都白,放完后优先在最左边优先放左黑右白,在最右边优先放左白右黑,将他们和左右都黑可以搭配使用,总归是判定为一个
AC代码:
#include #define rep(i,a,n) for(int i=a;i using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; rep (oo, 0, T) { int E, L, R, B; cin >> E >> L >> R >> B; int minn = 0, maxx = 0; int E1, L1, R1, B1; E1 = E, L1 = L, R1 = R, B1 = B; if (B > 0) { if (L > 0) { L--; } if (R > 0) { R--; } minn++; } minn += min({L, R}); int x = min({L, R}); L -= x; R -= x; minn += E + L + R; if (E1 >= B1) { maxx = E1 + B1 + R1 + L1; } else { if (B1 > 0) { maxx++; B1--; } B1 -= E1; maxx += 2 * E1; if (L1 + R1 >= B1) { maxx += B1; maxx += L1 + R1 - B1; } else { maxx += L1 + R1; } } cout << minn << " " << maxx << '\n'; } return 0; }a,b,c三边要保证构成三角形,每次选择一条边减去一个正整数,最后不能走的人算输,这个可以想成取石头博弈,那么取石头博弈的最终是没有石头,而这个题的最终是三边都为1的时候相当于没石头了
AC代码:
#include #define rep(i,a,n) for(int i=a;i using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; rep (oo, 0, T) { int a, b , c; cin >> a >> b >> c; a--, b--, c--; if (a ^ b ^ c) { cout << "Win\n"; } else { cout << "Lose\n"; } } return 0; }