這題雖然想到了貪心+二分,但是模擬細節wa到懷疑人生…
因 為考
慮每個p
有兩種走
法,向左
走再向右
走因為考慮每個p有兩種走法,向左走再向右走
因為考慮每個
p有兩種
走法,向
左走再向
右走 或者向
右走再向
左走
或者向右走再向左走
或者向右走再
向左走
那 麼我
們先考慮
第乙個p
那麼我們先考慮第乙個p
那麼我們先考
慮第乙個
p 這 個p
左邊的所
有∗都被
吃掉,設
走到最左
邊的∗距
離是
l這個p左邊的所有*都被吃掉,設走到最左邊的*距離是l
這個p左邊的
所有∗都
被吃掉,
設走到最
左邊的∗
距離是l然後
右邊也會
有部分∗
被吃掉,
設走到最
右邊的∗
是r
然後右邊也會有部分*被吃掉,設走到最右邊的*是r
然後右邊也會
有部分∗
被吃掉,
設走到最
右邊的∗
是r 所以就
是需要走
min(
l,r)
∗2+m
ax(l
,r
)所以就是需要走min(l,r)*2+max(l,r)
所以就是需要
走min
(l,r
)∗2+
max(
l,r)然後
記錄一下
這個p走
到最右邊
的點
r然後記錄一下這個p走到最右邊的點r
然後記錄一下
這個p走
到最右邊
的點r
下 乙個
p需要把
r到自己
間的∗都
吃掉
下乙個p需要把r到自己間的*都吃掉
下乙個p需要
把r到自
己間的∗
都吃掉
#include using namespace std;
const int maxn=2e5+10;
#define f first
#define s second
typedef pairp;
int n,top,left,in[maxn],sumn;
char a[maxn];
bool isok(int mid)
l=index+1;
for(int j=index+1;j<=n;j++)//現在就盡可能多吃[index+1,n]的*
}if(temp==sumn) return true;
else return false;
}int main()
else if(a[i]=='p') in[++top]=i;
} int l=1,r=n*2,mid,ans;
while(r>=l)
cout<另乙份貪心+二分思路來
源於
思路**於
思路**
於點我呀
#include using namespace std;
int n;
char s[200009];
bool isok(int mid)
cout<}
二分貪心 21
題目大概 有n堆積木,積木高度不同,每個小方塊高度相同。問,最少移動多少小方塊,使得這些積木堆高度相等。思路 先求這些積木的平均數,在把所有的高度與平均數的差值加起來,最後除2,就是最少移動的方塊數。感想 這個題有一點很坑人,最後輸出的時候有乙個小點,不注意看看不到。include include ...
二分貪心 E
題目 輸入n和c,n代表有n間屋子c代表有c頭牛,然後輸入n個數代表這n間房子的座標,牛不喜歡這個布局,一進去就會很暴躁,所以要把牛分的盡可能的遠求最近兩頭牛的最大距離。解題思路 建立乙個陣列存這些房子的座標,然後用sort將這些座標排序,然後令l 0,r a n mid l r 2,先用mid當作...
二分貪心 T
題目 有1 1,2 2,3 3,4 4,5 5,6 6大小的盒子,要把它們裝到6 6的盒子裡,它們的高度都是相同的,用最少的6 6盒子把所有尺寸的盒子都裝起來。解題思路 6 6,5 5以及4 4尺寸的物品每個物品需要占有乙個箱子,3 3的物品乙個箱子可以放4個,2 2的物品箱子可以放9個,1 1的可...