1. 程式人生 > >CF D. Walking Between Houses (貪心)

CF D. Walking Between Houses (貪心)

sin || 技術分享 nbsp play one 什麽 bsp hid

題意:
現在有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; }
View Code

CF D. Walking Between Houses (貪心)