注:與cf上的sweets for everyone!不一樣
幾個關鍵點:
1.剛開始的位置是0。
2.在時間充裕的前提下,如果手上的糖不夠,可以路過h不發糖,去s買了回來再發。
3.但是每個s只能買一次糖。
4.如果時間t內不能給所有鄰居發完糖果,則輸出-1。
5.為了剛開始帶最少的糖果,每經過乙個s一定買糖果。
誤解:剛開始以為不能走回頭路
**如下:
#include
#include
#include
#include
#include
#include
using namespace std;
const
int maxn=
1e5+
100;
int n,t;
char s[maxn]
;bool check
(int num)
//num為當前手中的糖果
else
if(s[i]
=='s'
) st.
pop();
time=i;
}else
// 如果前面的h都已經發完糖果,則遇到s一定買糖果
num++;}
}if(st.
size()
>0)
return false;
//如果糖果不夠,直接返回
if(m==0)
return time<=t;
//如果無需往返,則直接判斷時間
sum[0]
=0;for
(int i =
1;i<=m;i++
) sum[i]
=(r[i]
-l[i])*
2+ sum[i-1]
;//前i段重複兩邊的總時間
int ans=time+sum[m]
;//全程重複兩遍的總時間
for(
int i=
1;i<=m;i++
) ans =
min(ans,time+sum[i-1]
+time-l[i]);
//前i段重複一遍從第i段起重複一遍的總時間
return ans<=t;
}int
main()
printf
("%d\n"
,right);}
return0;
}
貪心 LeetCode135 分發糖果
老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。按照以下要求,幫助老師給這些孩子分發糖果,老師至少需要準備多少顆糖果呢?輸入 1,0,2 輸出 5 解釋 你可以分別給這三個孩子分發 2 1 2 顆糖果。輸入 1,2,2 輸出 4 解釋 你可以分別給這三...
發糖果問題
題目描述 老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,...
二分貪心 21
題目大概 有n堆積木,積木高度不同,每個小方塊高度相同。問,最少移動多少小方塊,使得這些積木堆高度相等。思路 先求這些積木的平均數,在把所有的高度與平均數的差值加起來,最後除2,就是最少移動的方塊數。感想 這個題有一點很坑人,最後輸出的時候有乙個小點,不注意看看不到。include include ...