CF D. Walking Between Houses (貪心)
阿新 • • 發佈:2018-08-05
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--) {View Codeint num=min(s-k,n-1); s-=num; if(now+num<=n) now+=num; else now-=num; printf("%d ",now); } puts(" "); return 0; }
CF D. Walking Between Houses (貪心)