CF D. Walking Between Houses (贪心)

题意: 
现在有n个房子排成一列,编号为1~n,起初你在第1个房子里,现在你要进行k次移动,每次移动一都可以从一个房子i移动到另外一个其他的房子j里(i != j),移动的距离为|j - i|。问你进过k次移动后,移动的总和可以刚好是s吗?若可以则输出YES并依次输出每次到达的房子的编号,否则输出NO。

分析:首先观察下NO的情况,如果s<k 也就是说总步数都比不是次数的话,那肯定是NO拉,或者s>k*(n-1) 无论如何走都到吧了总步数,那也是NO;

什么时候是YES呢?我们可以贪心下,尽可能的走最大的,余下的步数肯定是小于(n-1),也就是每次走的路程是MIN(s-k,n-1); s-k就是用来解决余下的步数

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    long long n,k,s;
    scanf("%lld%lld%lld",&n,&k,&s);
    if(s<k||k*(n-1)<s)//最小与最大
    {
        puts("NO");
        return 0;
    }
    puts("YES");
    int now=1;
    while(k--)
    {
        int num=min(s-k,n-1);
        s-=num;
        if(now+num<=n)
        now+=num;
        else
        now-=num;
        printf("%d ",now);
    }
    puts(" ");
    return 0;
}

原文地址:https://www.cnblogs.com/shuaihui520/p/9425457.html

时间: 2024-11-06 17:26:37

CF D. Walking Between Houses (贪心)的相关文章

CF #374 (Div. 2) D. 贪心,优先队列或set

1.CF #374 (Div. 2)   D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优先队列 #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(

Codeforces Round #501 (Div. 3) D Walking Between Houses

翻译 给你一条数轴(出题人很喜欢数轴啊),上面有排列着\(n\)个点,编号为\(1\)到\(n\)(你开始在\(1\)).每次你要从一个点移动到另一个点(可以重复).移动距离为两点坐标之差的绝对值,问你是否能否在\(k\)次机会内里一共移动\(s\)距离,并输出方案. 思路 第四题还是比较难的,赛后想了几分钟时才有头绪. 毫无疑问还是贪心(出题人很喜欢贪心啊)!那么我们分类讨论,先看不合法的情况 无论如何走你也走不到那个距离 无论如何走你也会走超那个距离 看来只要能走到那个距离除外都是不合法的,

CodeForces D. Walking Between Houses

http://codeforces.com/contest/1015/problem/D There are nn houses in a row. They are numbered from 11 to nn in order from left to right. Initially you are in the house 11. You have to perform kk moves to other house. In one move you go from your curre

nyoj 1216——整理图书 CF 229D—— Towers——————【dp+贪心】

整理图书 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 小明是图书鹳狸猿,他有很多很多的书堆在了一起摆在了架子上,每摞书是横着放的,而且每摞书是订好的 是一个整体,不可分开,(可以想象架子是一条直线),但是这些书高度却参差不齐,小明有强迫症,看不得不整齐 所以他想让这些书的高度形成一个非降序列他才舒心,可是这些书是有序的,所以他只能把其中的一摞书和他相邻的书装订在一起 形成一摞新的书,那么他最少的装订次数是多少呢 输入 多组测试数据,处理到文件结束每组数据开始有一

cf 12B Correct Solution?(贪心)

题意: 一个数a,一个数b. 现在要将a的每一位上的数字重新整理,生成一个新的不含前导0的数a'. 问a'是否等于b. 思路: a上每一位的数字从小到大排序,找到最小的非零数和第一位交换. 代码: char s1[15],s2[15]; int main(){ scanf("%s%s",s1,s2); if(strcmp(s1,"0")==0 && strcmp(s2,"0")==0){ puts("OK");

cf 11B Jumping Jack(贪心,数学证明一下,,)

题意: 给一个数X. 起始点为坐标0.第1步跳1格,第2步跳2格,第3步跳3格,.....以此类推. 每次可以向左跳或向右跳. 问最少跳几步可以到坐标X. 思路: 假设X是正数. 最快逼近X的方法是不停向右走.如果越过了X,假设到了X1,则必有X1-X小于最后一步d. 如果X1-X是偶数,将之前的某个x变为-x.则可以到X. 如果X1-X是奇数,因为将之前的某个x变为-x,实际是后退2x格.所以必定要再向右走一步.直到X1-X是偶数.(其实只要走一步或两步) X是负数的情况和X是正数的情况一样.

CF.911F.Tree Destruction(构造 贪心)

题目链接 \(Description\) 一棵n个点的树,每次可以选择树上两个叶子节点并删去一个,得到的价值为两点间的距离 删n-1次,问如何能使最后得到的价值最大,并输出方案 \(Solution\) 树上距离,求最大,可以考虑下树的直径 假如已知树的直径u->v,那么任意一点x到达其他点的最远距离就是u,v中一点(如果不是这样,那直径一定可以更长而不是uv) 假设x距u最远,那肯定是删x 删直径上的点(直径端点)会导致一些点取不到最远距离 既然这样按顺序删非直径上的点,最后删直径端点 #in

CodeForces - 1015 D.Walking Between Houses

Description Natasha is planning an expedition to Mars for nn people. One of the important tasks is to provide food for each participant. The warehouse has mm daily food packages. Each package has some food type ai. Each participant must eat exactly o

【CF 460C】Present

[CF 460C]Present 二分+贪心 二分最矮高度的最大值 每二分一个遍历看是否可达 可达low = mid+1不可达high = mid-1 可达的判断用贪心即可 改点长度不足时 在改点设置浇水点 同是在i+w设置断水 之后每个点都继承前一个点的浇水量 到i+w时减少i处浇的水即可 代码如下: #include <iostream> #include <cstdio> #include <cstring> #define sz 100000 #define l