codeforces B. Ternary Sequence

codeforces B. Ternary Sequence
文章图片

题目 题意: 给你 6 6 6个数字分别代表两个序列中的 0 , 1 , 2 0,1,2 0,1,2的数量,然后通过 c i = { a i ? b i , a i > b i 0 , a i = b i ? a i ? b i , a i < b i c_i=\begin{cases} a_i*b_i, & \text{$a_i>b_i$} \\0, & \text{$a_i=b_i$}\\-a_i*b_i, & \text{$a_ibi?ai?=bi?ai? 思路: 【codeforces B. Ternary Sequence】我们想要最大的话,那么 2 2 2要尽可能和 1 1 1匹配,因为和 0 , 2 0,2 0,2匹配的话,最后 c i = 0 c_i=0 ci?=0,然后我们可以算出此时的最大匹配就是 m a x ( n u m b 0 , n u m a 2 ) ? 2 max(numb_0, numa_2)*2 max(numb0?,numa2?)?2,但是如果 n u m b 2 numb_2 numb2?过大的话,会使这个最大匹配变小,所以要让 n u m b 2 numb_2 numb2?尽量和 n u m a 0 , n u m a 2 numa_0,numa_2 numa0?,numa2?匹配,如果还是有剩余,在和 n u m a 1 numa_1 numa1?匹配。

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector veci; typedef vector vecl; typedef pair pii; typedef pair pll; template inline void read(T &ret) { char c; int sgn; if (c = getchar(), c == EOF) return ; while (c != '-' && (c < '0' || c > '9')) c = getchar(); sgn = (c == '-') ? -1:1; ret = (c == '-') ? 0:(c - '0'); while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return ; } inline void outi(int x) {if (x > 9) outi(x / 10); putchar(x % 10 + '0'); } inline void outl(ll x) {if (x > 9) outl(x / 10); putchar(x % 10 + '0'); } int main() { int t; read(t); while (t--) { ll a, b, c, aa, bb, cc, ans = 0; read(a), read(b), read(c); read(aa), read(bb), read(cc); ans = min(bb, c) * 2ll; c = max(c - bb, 0ll); cc -= a + c; if (cc > 0) ans -= cc * 2ll; printf("%lld\n", ans); } return 0; }

    推荐阅读