Codeforces 1409C Yet Another Array Restoration

题目链接

题目:1409C

题解

题意

依据所给的xy构造一个全为正数的等差数列,要求使得数列中最大的数字最小。

思路

首先判断xy之间可以容纳多少数字,取最大值k,并依此求得等差数列的步长d,之后尝试使剩余的n - k -1个数字尽可能多地位于x之前,之后若仍有剩余则将其放在y之后。

AC代码

#include <bits/stdc++.h>

using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define eps (1e-8)
#define PI (acos(-1.0))
#define INF (0x3f3f3f3f)
#define mod (ull)(1e9+7)
typedef pair<int, int> P;

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    int T;
    scanf("%d", &T);
    while (T--) {
        int n;
        scanf("%d", &n);
        int x, y;
        scanf("%d%d", &x, &y);
        vector<int> ans;
        ans.push_back(x);
        ans.push_back(y);
        int k;
        int del = y - x;
        for (int i = n - 1; i >= 1; i--) {
            if (del % i == 0) {
                k = i;
                break;
            }
        }
        del = del / k;
        for (int i = 1; i <= k - 1; i++) {
            ans.push_back(x + del * i);
        }
        for (int i = 1; i <= n - k - 1; i++) {
            if (x - del > 0) {
                x -= del;
                ans.push_back(x);
            } else {
                y += del;
                ans.push_back(y);
            }
        }
        for (auto i: ans) printf("%d ", i);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45934120/article/details/108597227
今日推荐