注册了一个新号,第一次打,打到pupil了

A. Choose Two Numbers

给定$a,b$两个数列,输出一组数使得它们满足:

  • 一个来自$a$数列,一个来自$b$数列
  • 它们的和不存在任意一个集合中

solve

找到两个数列中最大数,两个数列最大数之和一定不存在于任意一个数列中。
此操作可以在输入时完成

Codeforces Submission

#include <iostream>
 
int main () {
    int i, j;
    int n, m, maxa = 0, maxb = 0, x;
    std::cin >> n;
    for (i = 1; i <= n; ++ i) {
        std::cin >> x;
        if (x >= maxa) maxa = x;
    }
    std::cin >> m;
    for (i = 1; i <= m; ++ i) {
        std::cin >> x;
        if (x >= maxb) maxb = x;
    }
 
    std::cout << maxa << ' ' << maxb;
 
    return 0;
}

B. Make Product Equal One

给定一个数列,每给一个元素加上1或者减去1都需要1个花费,希望最终数列乘积为1,求最小花费。

考虑线性扫描,

  • 如果当前x为0,ans+1;
  • 如果当前x为正数,ans+当前数-1(当前数到1的花费);
  • 如果当前x为负数,ans-当前数-1(当前数到1的花费);

如果有0或者负数个数为偶数直接输出ans
否则输出ans+2

Codeforces Submission

#include <iostream>
 
typedef long long ll;
 
int main () {
    int i, j;
    ll n, x, ans = 0, f = 1;
    bool flag = false;
    std::cin >> n;
    for (i = 1; i <= n; ++ i) {
        std::cin >> x;
        if (x < 0) ans -= (x + 1), f *= -1;
        if (x > 0) ans += (x - 1);
        if (x == 0) flag = true, ++ ans;
    }
 
    if (flag || f == 1) std::cout << ans;
    else std::cout << ans + 2;
 
    return 0;
}