你知道just odd inventions社嗎?這個公司的業務是「只不過是奇妙的發明(just odd inventions)」。這裡簡稱為joi社。
joi社有n名員工,編號從1到n。所有員工的工作時間從時刻0持續到時刻m,時刻0和時刻m的時候,所有員工都必須在公司內。
某天,出於巧合,joi社的每個員工都要出行恰好一次。員工i(1<=i<=n)在時刻si離開公司,時刻ti回到公司。同一時刻不會同時有兩名以上的員工離開或回到公司。
joi社的入口處有一扇巨大的門,員工只能通過這扇門離開或回到公司。門上掛著一把鎖,從公司內部可以任意開鎖或上鎖,但從公司外部只有持有備用鑰匙的人才能開鎖或者上鎖。時刻0時,鎖是鎖上的。
每個社員在回到公司的時候,都必須能夠進入公司。換句話說,對於任意1<=i<=n,要麼員工i持有備用鑰匙,要麼時刻ti時門是開著的,否則是不被允許的。員工回到公司的時候,或者攜帶備用鑰匙的員工離開公司的時候,可以選擇鎖門或不鎖。沒有攜帶備用鑰匙的員工離開公司的時候沒有辦法鎖門。
joi社的社長決定把備用鑰匙交給n個員工中的k個人。為了避免鑰匙的丟失,員工之間不允許借用鑰匙。此外,joi社的社長很重視時間效率,因此每個員工在離開或回到公司的時刻以外,不允許開鎖或者上鎖。
出於安全的考慮,社長希望上鎖的時間越長越好。現在他將員工出入公司的資訊和準備交給員工的鑰匙數量告訴了你,請你求出在能使所有員工回到公司的時候都能進入公司的大門的前提下,上鎖的時間最長是多少。
首先把所有進出時間都放在座標系下,發現相鄰的兩個點會有4種情況:
第一種:左出右出
只需要左端點那個人帶鑰匙該區間便可以獲得其中的值。
第二種:左進右進
右端點那個人帶鑰匙該區間便可以獲得其中的值。
第三種:左進右出
都不用拿,直接計入答案。
第四種:左出右進
兩人都帶鑰匙該區間便可以獲得其中的值。
對於前兩種情況,設v[i]表示當i這個人拿了鑰匙時,可以給答案貢獻多少;
而第四種情況,可以將兩個人連一條邊,然後就會發現很多個聯通塊,而且都是以一條鏈的形式。
然後,所有的鏈排在一起,給每乙個點按位置乙個新的編號。
問題轉化為,有n個點,選取每個點有得分,並且同時選取乙個點以及它的上乙個點有額外得分,求選出k 個點的最高得分。
就可以用dp解決:
設f[i][j]表示前i個點,選了j個點,其中包括i,的最大得分;
f[i][j]=max(max(f[1~i-2][j-1]),f[i-1][j-1]+當選取了i-1和i時可以獲得的額外得分)+v[i]
其中max(f[1~i-2][j-1])可以開乙個動態陣列表示:
設g[j]表示當前做到i的max(f[1~i-2][j])。
然後就變成了
f[i][j]=max(g[j-1],f[i-1][j-1]+當選取了i-1和i時可以獲得的額外得分)+v[i]
#include #include #include #include #include #include #include const int maxlongint=2147483647;
using namespace std;
int g[4005],v[4005],tog[4005],f[4005][4005],b[4005][5],n,m,tot,ans,k,mx,d[4005],next[4002];
bool bz[4002];
void q(int l,int r)
} if(i1)
f[i][j]=max(g[j-1],f[i-1][j-1]+tog[d[i]]);
f[i][j]+=v[d[i]];
g[j]=max(g[j],f[i-1][j]);
mx=max(mx,f[i][j]);
} }printf("%d\n",mx+ans);
}
NOIP2015模擬11 3 備用鑰匙
你知道just odd inventions社嗎?這個公司的業務是 只不過是奇妙的發明 just odd inventions 這裡簡稱為joi社。joi社有n名員工,編號從1到n。所有員工的工作時間從時刻0持續到時刻m,時刻0和時刻m的時候,所有員工都必須在公司內。某天,出於巧合,joi社的每個員...
NOIP2015模擬11 3 裝飾大樓
給出乙個序列a,ai表示對於乙個h序列來講,以i結尾的lis的長度。h中的數兩兩不等。現在你知道了a刪去乙個數之後的序列b 未知刪掉哪位 求a序列有多少種。a 10 6 好多細節呀!不爽,懶得打題解。可以發現,對於乙個序列a,它滿足條件的前提就是,對於每乙個ai,都存在乙個aj j i 滿足aj 1...
裝飾大樓 NOIP2015模擬11 3
其實和這東西只是扯上邊而已,完全沒有考演算法 切入正題 際資訊學奧林匹克競賽將要在日本召開了。為了歡迎全世界的選手們,委員會決定將從機場到宿舍沿路的大樓裝飾起來。根據某著名設計師的設計,做裝飾的大樓從機場到宿舍的方向必須高度嚴格遞增。也就是說,如果做裝飾的大樓從機場開始高度順次為hi,那麼必須滿足h...