time limit: 10 sec
memory limit: 128 mb
submit: 1493
solved: 830 [
submit][
status][
discuss]
小p在mc裡有n個牧場,自西向東呈一字形排列(自西向東用1…n編號),於是他就煩惱了:為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場(它西邊第乙個控制站所在的牧場不被控制)(如果它西邊不存在控制站,那麼它控制西邊所有的牧場),每個牧場被控制都需要一定的花費(畢竟在控制站到牧場間修建道路是需要資源的嘛~),而且該花費等於它到控制它的控制站之間的牧場數目(不包括自身,但包括控制站所在牧場)乘上該牧場的放養量,在第i個牧場建立控制站的花費是ai,每個牧場i的放養量是bi,理所當然,小p需要總花費最小,但是小p的智商有點不夠用了,所以這個最小總花費就由你來算出啦。
第一行乙個整數 n 表示牧場數目
第二行包括n個整數,第i個整數表示ai
第三行包括n個整數,第i個整數表示bi
只有一行,包括乙個整數,表示最小花費
4 2 4 2 4
3 1 4 29
很簡單的斜率dp
首先最後乙個牧場一定要放控制站,先假設其它地方都不放,求出**
dp[i]表示在i處建站能節省的最多費用,有
sum[i] = ∑b[i]
dp[i] = max(dp[j]+sum[i]*(j-i), j∈(i, n] )-a[i]
ans = ∑b[i]*(n-i)-max(dp[i], i∈[1, n] )
#include#includeusing namespace std;
#define ll long long
ll a[1000005], b[1000005], sum[1000005], dp[1000005], st[1000005];
double jud(int j, int k)
int main(void)
ans = a[n];
for(i=1;i<=n;i++)
ans += b[i]*(n-i);
l = 1, r = 1;
st[1] = n;
bet = 0;
for(i=n-1;i>=1;i--)
printf("%lld\n", ans-bet);
return 0;
}
bzoj 3437 小P的牧場 斜率優化
time limit 10 sec memory limit 128 mb 小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站...
bzoj3437 小p的牧場 斜率優化dp
背景 小p是個特麼喜歡玩mc的孩紙。描述小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的...
BZOJ3437 小P的牧場(斜率優化dp)
傳送門 這種題就是用來水的。fi max si表示總費用和,di表示距離 相當於題目中有多少個點 ci表示放養數量,ai表示費用,都是字尾和。喔然後斜率優化。include include include using namespace std define ll long long const i...