wyt有一把巨大的刷子,刷子的寬度為m公尺,現在wyt要使用這把大刷子去粉刷有n列的柵欄(每列寬度都為1公尺;每列的高度單位也為公尺,由輸入資料給出)。
使用刷子的規則是:
與地面垂直,從柵欄的底部向上刷
每次刷的寬度為m公尺(當剩餘柵欄寬度不夠m公尺的話,刷子也可以使用,具體看樣例2)
對於連續的m列柵欄,刷子從底向上,刷到的高度只能到這m列柵欄的最低高度。
wyt請你回答兩個問題:
最少有多少個單位面積不能刷到(單位面積為1平公尺)
在滿足第一問的條件下,最少刷幾次?
共兩行:
第一行兩個整數n和m。
第二行共n個整數,表示n列柵欄的高度
一行,兩個整數,分別為最少剩餘的單位面積數量和最少刷的次數。
樣例輸入1
5 3樣例輸出15 3 4 4 5
3樣例輸入22
10 3樣例輸出23 3 3 3 3 3 3 3 3 3
0樣例輸入34
7 4樣例輸出31 2 3 4 3 2 1
4樣例1的解釋:4
高度分別為 5 3 4 4 5 如上:
黃色的方塊表示共有3個單位面積沒刷上
綠色的框和紅色的框表示一共刷了兩次。
30%的資料:n<=10^3
50%的資料:n<=10^5
100%的資料:1<=n<=10^6, 1<=m<=10^6,n>=m, 每列柵欄的高度<=10^6.
如果某乙個柵欄能被刷完,他向左和向右延伸的寬度(包括自己)之和應該不小於刷子的寬度 m、
因此,我們可以先處理一下每個柵欄向左向右延伸的寬度。
得到了延伸的寬度之後,我們也就可以判斷每個柵欄是否能被完整的粉刷
可以先給每個柵欄標記一下,即如果延伸的寬度不小於 m,則標記為能刷完,否則標記為刷不完
因為要求最少剩下的方塊數量,下一步我們就可以求一下每個柵欄還剩多少不能刷,遞推處理一下每個柵欄能被刷的最大高度。
我們先從左往右考慮一下,如果第i個柵欄能被刷完,那麼最大高度就是它本身的高度;
如果不能,則它的高度一定比它左邊的柵欄能刷的最大高度要大(如果不成立,那麼它完全可以接在它左邊的柵欄上,把自己刷完)
因此它能刷到的最大高度就是它左邊的柵欄能刷到的最大高度。
然後還要從右邊處理一下,有可能對於每乙個柵欄,右邊過來可能刷的更高,所以需要求一下最值。
既然有了每個柵欄能刷的最大高度,那麼用每個柵欄的高度之和減去所有能刷的最大高度就是剩餘的面積。
要求刷的次數,因為每個柵欄都要刷到最高,所以貪心刷就可以了。
如果幾個連續的柵欄刷的最大高度相同,那麼就一起刷,寬度除以 m 就是次數。如果相鄰兩個刷的高度不一樣,那麼從此處斷開重新刷就可以了。
#includeusing namespace std;
const int maxn=1e6+5;
int gd[maxn],l[maxn],r[maxn],que[maxn],vis[maxn],sd[maxn];
int main()
int head=0,tail=-1;
for(int i=1;i<=n+1;i++)
for(int i=1;i<=n;i++)
for(int i=n;i>=1;i--)
long long sum=0;
for(int i=1;i<=n;i++)
printf("%lld\n",sum);
int now=2,cs=0;
while(now<=n+1)
if(cnt%m==0) cs+=cnt/m;
else cs+=(cnt/m+1);
now++;
}printf("%d\n",cs);
return 0;
}
牛客網刷題(1)重點錯題
1 在32位機器中,如下 void example char acwelcome void main 結果為 4 陣列名作為函式傳參是作為指標使用的。2 下面的程式可以從0 n 1中隨機等概率的輸出m個不重複的數。這裡我們假設n遠大於m knuth int n,int m 選項 rand n i m...
牛客網刷題(2)重點錯題
1.32位機器上定義如下結構體 struct xx int xx x5 1 請問sizeof xx 的大小是 答案 24 解析 首先 x5是靜態變數可以不用管它,其次是要考慮位元組對齊的問題。對於結構體中沒有含有結構體變數的情況,有兩條原則 1 結構體變數中成員的偏移量必須是成員大小的整數倍 2 結...
LeetCode刷題之187 重複的DNA序列
我不知道將去向何方,但我已在路上!輸入 s aaaaacccccaaaaaccccccaaaaagggttt 輸出 aaaaaccccc cccccaaaaa class solution def findrepeateddnasequences self,s str list str a set ...