[题解] Codeforces Round #667 (Div. 3) C题 解题报告

题意

要求我们还原原数组arr,给定了原数组的几种特性:

1、包含n个正整数

2、包含两个已知的正整数x,y,且 (x<y)

3、原数组中的每两个相邻正整数之间的差值相同,即:(a_2−a_1=a_3−a_2=…=a_n−a_{n−1})

最后要求输出原数组,答案可能不唯一,要求使原数组中最大的一个数的值尽可能地小,即:尽可能让 (max(a_1,a_2,…,a_n)) 最小

解题思路

1、我们尝试让 x 到 y 中尽可能地填满剩下的(n-2)个值,尽管可能填不下,则尽可能地添加更多,剩下的优先添到 x 的左侧,当左侧添不了,则在添到 y 的右侧,直到输出了 n 个数为止。

2、计算 x 到 y 需要加多少个 k。可以用暴力枚举来计算: (m=(x-y))枚举 n 到 1 直到(k%m=0),此时,x 到 y 需要加 (k÷m) 个 k。

3、输出以上枚举的数,接下来还需要输出 (n-(k+1)) 个数,方法在第 1 条。

代码实现

#include <iostream>
 
using namespace std;
 
void solve ( void )
{
    int n, l, r;
    cin >> n >> l >> r;
    
    int x = r - l, k = n - 1, t = l;
    while ( x % k != 0 ) k--;
    
    x /= k;
    
    cout << l << ' ';
    
    for ( int i = 0; i < k; i++ )
    {
        t += x;
        cout << t << ' ';
    }
 
    n -= ( k + 1);
    
    while ( n )
    {
        l -= x;
        if ( l > 0 )
        {
            cout << l << ' ';
            n--;
        } else {
            break;
        }
    }
    
    while ( n )
    {
        t += x;
        cout << t << ' ';
        n--;
    }
    
    cout << endl;
}
int main ( void )
{
    int T;
    cin >> T;
    
    while ( T-- ) solve();
    
    return 0;
}
作者:Jude_Zhang
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
原文地址:https://www.cnblogs.com/judezhang/p/14577874.html