codeforces B. Ternary Sequence

codeforces B. Ternary Sequence_第1张图片

题目

题意:

给你 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_ici=aibi,0,aibi,ai>biai=biai<bi,最后计算出最大的 ∑ i = 1 n c i \sum^n_{i=1} c_i i=1nci

思路:

我们想要最大的话,那么 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<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T>
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;
}

你可能感兴趣的:(codeforces)