zoukankan      html  css  js  c++  java
  • [题解] 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 许可协议。转载请注明出处!
    支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    jxl导入/导出excel
    iText导出pdf、word、图片
    Java CSV操作(导出和导入)
    Spring3.0+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务
    jQuery插件:跨浏览器复制jQuery-zclip
    微信小程序之表单提交
    微信小程序只之全局存储
    微信小程序之工具js封装与使用
    重构的艺术 深入认识
    重构的素养
  • 原文地址:https://www.cnblogs.com/judezhang/p/14577874.html
Copyright © 2011-2022 走看看