1. 程式人生 > 實用技巧 >CF1463-B. Find The Array

CF1463-B. Find The Array

題意:

給出一個由n個數組成的陣列a,這個陣列的元素和為S,要求你找出一個由n個數字組成陣列b,這個陣列滿足:

  • 陣列中的每個數可以將他兩邊的數字整除或者被他兩邊的數字整除

  • 陣列b中每個位置的數字減去陣列a中相應位置的數字的絕對值和的二倍小於等於S

輸出任意一個滿足的陣列b

思路:

考慮到1可以整除任何數字,那麼可以讓1作為橋樑,兩邊可以放置任意數字就可以構造出一個符合第一個要求的陣列b,之後也可以按照這個思路進行構造。

現在我們可以想到,讓較小的數字減去1,讓較大的數字減去我們任意放置的數字,這樣可以讓最終求出來的和儘量小,那麼這個任意放置的數字是多少的時候可以讓最終求出來的和儘量小呢?讓較大的數字減去他自己是最小的。

最後要考慮的是,我們應該把1這個跳板放在什麼位置呢?我們可以按照陣列a下表的奇偶統計他們和分別是多少,這樣將1放在和較小的位置上。比如奇數位置上和較小,那麼構造出來的b陣列就是\(\{a_0, 1, a_2, 1, a_4, 1...\}\), 同理偶數。

AC程式碼:

#include <cstdio>
#include <cstring>

typedef long long ll;

const int maxn = 55;

ll a[maxn];

int main () {
    int T, n;
    scanf ("%d", &T);
    while (T--) {
        scanf ("%d", &n);
        ll t[2] = {0, 0};
        for (int i = 0; i < n; i++) {
            scanf ("%lld", &a[i]);
            t[i & 1] += a[i];
        }
        for (int i = 0; i < n; i++) {
            if (t[0] > t[1]) {
                printf ("%lld%c", i & 1 ? 1 : a[i], " \n" [i == n - 1]);
            } else {
                printf ("%lld%c", i & 1 ? a[i] : 1, " \n" [i == n - 1]);
            }
        }
    }
    return 0;
}