1. 程式人生 > >CF1066B Heaters(貪心)

CF1066B Heaters(貪心)

-s color algorithm ali cst define 平面 right -html

題意描述:

Vova先生的家可以看作一個n×1的矩形,寒冷的冬天來了,Vova先生想讓他的家裏變得暖和起來。現在我們給你Vova先生家的平面圖,其中111表示這個地方是加熱爐,0表示這個地方什麽也沒有。所有加熱器都有一個加熱半徑r,一個位於ai加熱器可以加熱[ai−r+1,ai+r−1]的範圍。現在,Vova先生想讓他的整個家都變得暖和,一開始所有的加熱器都是關閉的,請你求出Vova先生最少要開幾個加熱器才能使整個家變得暖和

輸入輸出格式:

輸入格式:

第一行:兩個整數n,r(1≤n,r≤1000),含義如上

第二行,n個整數,表示Vova家的地圖

輸出格式:

一個整數,表示Vova先生至少要打開幾個加熱器

思路:

還是很水

因為我們要盡可能少,所以我們要用貪心的思想

我們從最左邊開始掃,掃到一個沒有被加熱的點,我們就以這個點為起點向右掃,掃到能加熱他的離他最遠的一個加熱器打開

(貪心的正確性在於這個加熱器離他最遠且能將它加熱,如果選更近的則不更優,選更遠的就加熱不了他了)

然後將該加熱器能加熱的範圍內的點打標記,繼續掃下去即可

最壞時間復雜度O(N^2)

代碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include
<algorithm> #define rii register int i #define rij register int j using namespace std; int n,r,jz[4005],jrq[4005],bj[4005],ans; int main() { int cnt=0; scanf("%d%d",&n,&r); for(rii=1;i<=n;i++) { scanf("%d",&jz[i]); if(jz[i]==1) { cnt
++; jrq[cnt]=i; } } for(rii=1;i<=n;i++) { if(bj[i]==0) { int wz=0; for(rij=1;j<=r;j++) { if(i+j-1<=n) { if(jz[i+j-1]==1) { wz=max(wz,i+j-1); } } if(i-j+1>=1) { if(jz[i-j+1]==1) { wz=max(wz,i-j+1); } } } for(rij=1;j<=r;j++) { if(wz-j+1>0) { bj[wz-j+1]=1; } bj[wz+j-1]=1; } ans++; if(wz==0) { printf("-1"); return 0; } } } printf("%d",ans); }

CF1066B Heaters(貪心)