居民集會
藍橋村的居民都生活在一條公路的邊上,公路的長度為l,每戶家庭的位置都用這戶家庭到公路的起點的距離來計算,第i戶家庭距起點的距離為di。
每年,藍橋村都要舉行一次集會。今年,由於村里的人口太多,村委會決定要在4個地方舉行集會,其中3個位於公路中間,1個位最公路的終點。
已知每戶家庭都會向著遠離公路起點的方向去參加集會,參加集會的路程開銷為家庭內的人數ti與距離的乘積。
給定每戶家庭的位置di和人數ti,請為村委會尋找最好的集會舉辦地:p1, p2, p3, p4 (p1<=p2<=p3<=p4=l),使得村內所有人的路程開銷和最小。
【輸入格式】
輸入的第一行包含兩個整數n, l,分別表示藍橋村的家庭數和公路長度。
接下來n行,每行兩個整數di, ti,分別表示第i戶家庭距離公路起點的距離和家庭中的人數。
【輸出格式】
輸出一行,包含乙個整數,表示村內所有人路程的開銷和。
【樣例輸入】
6 10
1 32 2
4 55 20
6 58 7
【樣例輸出】
18【樣例說明】
在距起點2, 5, 8, 10這4個地方集會,6個家庭需要的走的距離分別為1, 0, 1, 0, 2, 0,總的路程開銷為1*3+0*2+1*5+0*20+2*5+0*7=18。
【資料規模與約定】
對於10%的評測資料,1<=n<=300。
對於30%的評測資料,1<=n<=2000,1<=l<=10000,0<=di<=l,di<=di+1,0<=ti<=20。
對於100%的評測資料,1<=n<=100000,1<=l<=1000000,0<=di<=l,di<=di+1,0<=ti<=1000000。
資源約定:
峰值記憶體消耗 < 512m
cpu消耗 < 5000ms
參考大佬的思路,是不是大佬都不寫注釋,想了好久才想明白。。。
思路:把居民看成是排列好的一堆物品,其價值就是,居民的人數到聚會地點的距離。然後開會的地點看成是從這個位置開始將左邊的某一段物品全部放進揹包,共計拿三次,求出揹包的最小值。上式dp[i][j]代表從第i個位置向左第j次拿取物品。
**:
#include#include#include#include#include#include#includeusing namespace std;
#define inf 1.0e14;
const int maxn = 1e5+100;
typedef long long ll;
int a[maxn];
int b[maxn];
ll dp[maxn][4];
ll sum[maxn][4];
int main()
else if(i>j)///i1) ans=min(ans,dp[n][1]);///如果n==2,最多隻需要2個聚會地點
if(n>2) ans=min(ans,dp[n][2]);
if(n>3) ans=min(ans,dp[n][3]+sum[n][3]*(m-a[n]));
cout<
網上有其他做法,但是感覺對於10%的資料應該會tle,但是比賽時能寫出來得分就很不錯了。
#include#include#include#includeusing namespace std;
const int maxn=10000+5;
int d[maxn],t[maxn],n,l;
int w[maxn][maxn];
int solve(int x,int y,int cur) //[x,y] 還能分cur次
{ if(!cur) return w[x][y];
int ml,mr,m;
m=2*w[0][l];
for(int m=x+1;mi&&d[k]
01揹包變形
傳送門 現有n個物品,序號分別為1,2,n。對於每個i 1 i n 物品i有乙個體積wi和乙個價值vi。小明想在這n個物品中選取一些放到揹包裡帶回家。已知揹包的容積為w,這意味著所帶物品的總體積不能超過w。求出小明可以帶回家的物品總價值可能的最大值。constraints input 標準輸入格式如...
揹包dp之01揹包變形
一種雙核cpu的兩個核能夠同時的處理任務,現在有n個已知資料量的任務需要交給cpu處理,假設已知cpu的每個核1秒可以處理1kb,每個核同時只能處理一項任務。n個任務可以按照任意順序放入cpu進行處理,現在需要設計乙個方案讓cpu處理完這批任務所需的時間最少,求這個最小的時間。輸入描述 輸入包括兩行...
python解決揹包 揹包變形問題
有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。例如 揹包的承重為10,現在有a,b,c,d,e五件物品,每件物品的重量分別為2,2,6,5,4,價值分別為6,3,5,4...