题目链接
题目:1409C
题解
题意
依据所给的x
和y
构造一个全为正数的等差数列,要求使得数列中最大的数字最小。
思路
首先判断x
和y
之间可以容纳多少数字,取最大值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;
}