你要按照順序以此經過n個商店,每到達乙個商店你可以購買一件物品,也可以**你手中的商品。 同一時刻你手上最多拿一件商品。在第i個商店購買和**的代價都是a[i]。
問你經過完n個商店後的最大收益。 同時,在最大化收益的前提下,求最小的交易次數。
不難發現,要想使得利益最大,我們肯定是要在乙個單調區域中的最小值中購入,再從該單調區域的最大值時轉出。倘若發現了這個事實,則我們就可以將題目轉化為乙個判斷兩個單調區間的拐點為極大值還是極小值。(具體判斷方法就是將某個點與之前乙個和後乙個點比較)
倘若我們發現此時位於極小值,則我們需要更新**最小cur。而當我們發現此時位置處於極大值,則更新最大利益sum=當前**-最小**,並將最小**賦為-1代表沒有最便宜的物品。
而當我們取到最後乙個點時,我們需要特判一下,如果當前是極大值點亦或者 當前不是極大值點,但拿了乙個物品,則進行更新。
值得留意的是,如果遇到連續相同的**的時候(如數列[1,2,2,3,4]中的[2,2]),因為此時這些連續的**對結果沒有影響(甚至會阻礙我們的判斷)因此我們考慮將這些連續相同的點去重。
#include #define maxn 100005
using namespace std;
typedef long long ll;
ll a[maxn];
ll tmp[maxn];
int main()
int cnt=0;
for(int i=1;i<=n;i++)
if(tmp[i]!=tmp[i-1])
}ll cur=-1;
ll sum=0,num=0;
for(int i=1;i<=cnt;i++)
if(a[i]>a[i-1]&&a[i]>a[i+1])
else if(a[i]}
cout<}
}
2018暑假牛客多校二 C(凸包)
有乙個無線大的平面,平面上有n條斜率不為零的直線。有m次詢問,每次詢問從y軸上的乙個點出發往x軸正方向沿一條直線走,最後乙個與這n條直線相交的點的 橫座標。n,m 50000 根據題意我們可以,如果一條直線為 y ax b,另一條直線為 y cx d,則我們容易得出他們的交點的橫座標為 因此我們可以...
2018牛客暑假多校三 E(KMP運用)
給你乙個字串s,你要對字串s的每一位i將前i位的字串移動到尾部形成乙個新的字串,如果形成的字串相同則歸為一類li。現在讓你將li類按照字典序排序,並讓你輸出每一類的數量和每一類中字串對應的下標i。觀察可以發現,將字串移動形成新的字串,當且僅當字串中存在迴圈節時,才會出現新構成的字串相同。因此這個問題...
2018牛客多校3
h diff prime pairs 1 3 1 5 1 7 1 11.2 3 2 5 2 7 2 11.3 3 3 5 3 7 3 11.4 3 4 5 4 7 4 11.打個素數表 用素數篩一遍 includeusing namespace std bool a 11111111 int zs ...