首页 > 其他分享 >题解:CF1015D Walking Between Houses

题解:CF1015D Walking Between Houses

时间:2024-08-01 13:41:36浏览次数:14  
标签:Walking frac 题解 距离 Houses long Between

题解:CF1015D Walking Between Houses

算法

模拟,分类讨论

分析

首先,设每步走的距离为 \(t_i\),我们发现 \(t_i\) 应是满足 \(1\le t_i\le n-1\) 的。那么就很容易推出 NO 的情况:

  • 当 \(s<k\) 时,由于每一步都要至少走一个单位,所以 \(k\) 次步数肯定用不完,而题目要求恰好 \(k\) 次;
  • 当 \(\frac{s}{k}>n-1\) 时,此时我们把每一步都撑到了最大的距离也就是 \(n-1\) 个单位,但仍不满足要求,所以判负。

判完 NO 后,余下的就都是 YES 的情况,考虑怎么构造方案。

  • 如果 \(k\mid s\),容易想到一种构造方案为 \(\frac{s}{k},1,\frac{s}{k},…,1,\frac{s}{k}(,1)\)。

  • 如果 \(k\nmid s\),说明 \(s\div k\) 存在余数,那我们以上一种情况的方式处理后将余数加上即可。为了方便处理,我采用了上取整再将多走的距离减去的方法。这时多走的距离就是 \(\left\lceil\dfrac{s}{k}\right\rceil\times k-s\)。注意,在中间的某处减去一个单位的距离相当于少走了两个单位的距离(如 \(1,3,1\) 变为 \(1,2,1\)),那么在余数为奇数时,将中间的减完后会剩 \(1\),我们需要在结尾处理,此时需分类讨论。

    1. 当 \(k\) 为偶数时,原本 \(k\) 回到开头 \(1\),但因为我们处理剩下多走了 \(1\) 个单位的距离,所以我们少走一个应回到 \(2\)。
    2. 当 \(k\) 为奇数时,原本 \(k\) 会走到后面的 \(\frac{s}{k}\) 处,但因为我们多走了 \(1\) 个单位,所以我们将结尾走到的位置减 \(1\)。

最终输出答案即可,注意要开 long long,不然会 Wrong answer on test 8

示例代码

#include<bits/stdc++.h>
using namespace std;
#define int long long 
namespace Ryan
{
    const int N=2e5+5;
    vector<int> v;
    int n,k,s;
    signed work()
    {
        cin>>n>>k>>s;
        if(k>s||s*1.0/k>(n-1))
        {
            cout<<"NO"<<endl;
            return 0;
        }
        for(int i=1;i<=k;i++)
        {
            if(i&1)
                v.push_back(ceil(s*1.0/k)+1);
            else 
                v.push_back(1);
        }
        if(s%k)
        {
            int ss=ceil(s*1.0/k)*k-s;
            // cout<<ss<<"**\n";
            for(int i=1;i<=k&&ss-2>=0;i+=2)
            {
                ss-=2;
                v[i-1]--;
            }
            if(ss)
            {
                if(k&1)
                    v[k-1]-=1;
                else 
                    v[k-1]+=1;
            }
        }
        cout<<"YES"<<endl;
        for(auto it:v)
            cout<<it<<" ";
        return 0;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return Ryan::work();
}

标签:Walking,frac,题解,距离,Houses,long,Between
From: https://www.cnblogs.com/RyanAdam/p/18336487

相关文章

  • CF716B Complete the Word 题解
    CF716BCompletetheWord题解分析首先观察数据范围是\(50000\),可以考虑\(O(n)\)暴力。在字符串中枚举子串开始的位置\(i\),然后再枚举\(i\)到\(i+25\),开个桶统计每个大写字母出现的次数,如果大于\(1\)就直接break。统计完之后剩下的就都是问号了,可以随便填,所以这个子......
  • P3043 [USACO12JAN] Bovine Alliance G 题解
    P3043[USACO12JAN]BovineAllianceG题目传送门思路首先分情况讨论每种联通块的可能,有三种不同的情况会对答案\(ans\)产生不同的贡献。联通块有环如图,因为每条边都有要有归属,所以环上的边只能全都顺时针或逆时针属于某个点,且不在环上的点仅有一种可能。因此该情况对答......
  • 题解:CF687C The Values You Can Make
    CF687CTheValuesYouCanMake题解题目翻译感觉不明不白的(至少我看了几遍没看懂),这里给个较为清晰的题面。题目描述给你\(n\)个硬币,第\(i\)个硬币有一个价值\(c_i\),你需要从中选出一些价值和为\(k\)的硬币组成一个集合,再输出这个集合中硬币可能组成的价值和。算法动......
  • 题解:CF559B Equivalent Strings
    CF559BEquivalentStrings题解题目描述吐槽一下,题目翻译有歧义。思路分析你会发现,当你需要判断字符串\(a,b\)是否等价时,如果长度为偶数,需要继续判断字符串\(a\)拆分的字串。所用知识s.substr(i,j)//在字符串s中,从位置i开始截取长度为j的字串参考代码#include<bits......
  • 题解:CF718A Efim and Strange Grade
    CF718AEfimandStrangeGrade题解算法贪心+模拟思路分析显然,要最优每一次进位就只能五入不能四舍。而且当我们五入时,要取位数最高的。比如说\(1.3535\),我们有两种进位方式,一种是进位成\(1.4\),一种是进位成\(1.354\),显然前者更优。那这道题给的次数有啥用呢?考虑一种“......
  • P10511 方差 题解
    【题目简述】定义一个长度为\(n\)的序列\(a\)的方差为:\(s^2=\frac{1}{n}\sum_{i=1}^n(a_i-\overline{a})^2\)。\(\sum\)为累加求和符号,\(\overline{a}\)为序列\(a\)的平均数。给定\(m\)个形如\([l,r,b]\)的组合,表示\(a_l,a_{l+1},\ldots,a_r\)为\(b\)。给定......
  • 洛谷P2696之慈善的约瑟夫——题解
    洛谷P2696题解[传送锚点](P2696慈善的约瑟夫-洛谷|计算机科学教育新生态(luogu.com.cn))比不过大佬,从蒟蒻做起选择比较水有意思的解法——用队列模拟(还是窝太弱了)正片开始考虑队列模拟,因为每次都是假的剔除,所以我们的目标是找到每回游戏的最终存活者。将不被剔除,......
  • 题解:Pinely Round 4 (Div. 1 + Div. 2) C
    C.AbsoluteZerotimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouaregivenanarray\(a\)of\(n\)integers.Inoneoperation,youwillperformthefollowingtwo-stepmove:Choose......
  • Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]
    思路不难想,细节比较多。思路观察到\(n\le19\),首先想到状压dp。于是自然地定义\(dp[j][i]\)为:抵达点的状态为\(i\),且此时在点\(j\)时,简单路径的条数。注意这里是简单路径的条数,而不是环的个数,因为环的个数要在dp过程中统计。这里的dp作用就在于求简单路径条数。......
  • [JOI 2020 Final] 火事 题解
    给一篇题解。(下面这张图是从luogu上粘贴的,因为不太会画图)其中纵坐标为\(t\),横坐标为\(a_i\)。发现同颜色块只有平行四边形和直角梯形(等腰直角三角形)两种情况。可以将直角梯形削去左下角,分成两部分考虑。等直可以直接暴力插入区间,总个数\(O(n)\)。平行四边形可以看作上......