uva 10154 貪心+dp
題目連結:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1095
題目大意:有許多隻王八,每一隻王八有著兩個屬性,重量w和力量s,這些王八最多能疊多少層不會讓出現王八被壓死,注意王八承受的重量
要算上自己的重量
思路分析:首先是貪心,我們要選擇力量最大的王八放在下面是最優的,證明如下
分析,如果力量大的在下面,力量小的在上面,那麼力量大的還能承受的重力就是s[da]-w[xiao]-w[da],力量小的能夠承受的重力為s[xiao],前者可能大於,等於,或小於後者;如果力量小的在下面,力量大的在上面,那麼力量小的能夠承受的重力就是s[xiao]-w[xiao]-w[da],力量大的能夠承受的重力為s[da],前者一定小於後者,總的承重能力受制於前者。這兩種方式 第二種的總的承重能力顯然不及第一種,也就是第一種更優,所以力量大的在下面一定比力量輕的在下面更好。所以我們按力量排序。
按力量排序以後然後dp[i]代表疊i層所需要的最小的重量,按照01揹包寫法01滾動即可
程式碼:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; const int maxn=6000; struct node { int w; int s; }; node t[maxn]; int dp[maxn]; boolcmp(node a,node b) { if(a.s==b.s) return a.w<b.w; else return a.s<b.s; } const int inf=0xfffff; int main() { int a,b; int tot=1; while(scanf("%d%d",&a,&b)!=EOF) { if(b>=a) t[tot].w=a,t[tot++].s=b; // if(tot==5) break; } sort(t+1,t+tot,cmp); for(int i=1;i<tot;i++) { dp[i]=inf; } dp[0]=0; int ans=0; for(int i=1;i<tot;i++) { for(int j=tot-1;j>=1;j--) { if(t[i].s>dp[j-1]+t[i].w) { dp[j]=min(dp[j],dp[j-1]+t[i].w); if(dp[j]<inf) ans=max(ans,j); } } } printf("%d\n",ans); }
相關推薦
uva 10154 貪心+dp
題目連結:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1095 題目大意:有許多隻王八,每一隻王八有著兩個屬性,重量w和力量s,這些王八
【Weights and Measures】【UVA - 10154】(dp)
題目: I know, up on top you are seeing great sights, But down at the bottom, we, too, should have rights. We turtles can’t stand it. Our shells
uva 1292 樹形dp
tracking turn oid 狀態 wrap name names code ont UVA 1292 - Strategic game 守衛城市,城市由n個點和n-1條邊組成的樹,要求在點上安排士兵,守衛與點相連的邊。問最少要安排多少士兵。 典型的樹形dp
ZOJ 3689 Digging(貪心+dp)
ron tex calendar using gyp mic tar cmp rec Digging Time Limit: 2 Seconds Memory Limit: 65536 KB When it comes to the Maya Civili
Uva 11600 期望DP
hide blog memset -c cnblogs dbf return closed 期望dp 題意:n個城市,相互可達(有n(n-1)/2條邊),其中有一些道路上面有妖怪,現在,從1號城市出發,隨機挑取一個城市走去,這個道路上的妖怪就會被消滅,求: 在平均情況下,
HDU 1051 Wooden Sticks 貪心||DP
scanf rep code 子列 iss miss minimum span mission Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java
[uva 1350]數位dp+二分
div pos 題目 printf c++ ++ pac else space 題目鏈接:https://vjudge.net/problem/38405 #include<bits/stdc++.h> using namespace std; long l
uva 10026 貪心
urn sin return 字典序 pro std truct code 價值 https://vjudge.net/problem/UVA-10026 對於兩個二元組(Ti,Si),(Tj,Sj), 當先執行i時耗費的價值是Ti*Sj,反之則是Tj*Si, 顯然如
【BZOJ4069】[Apio2015]巴厘島的雕塑 按位貪心+DP
put lld bzoj 最大值 != script mes exp xpl 【BZOJ4069】[Apio2015]巴厘島的雕塑 Description 印尼巴厘島的公路上有許多的雕塑,我們來關註它的一條主幹道。 在這條主幹道上一共有 N 座雕塑,為方便起見,我
Problem 1538 - B - Stones II 貪心+DP
inf tdi cto fin 註意 algo queue truct stdout 還是給你石頭n枚,每一枚石頭有兩個值a和b,每取一個石頭,除了這塊石頭其余所有的石頭的a就都減去這個石頭的b,問你取了的石頭的a的總和最大可以為多少? 先按B從大到小排序 然後DP: 取
[BZOJ1044][HAOI2008]木棍分割 二分+貪心+dp+前綴和優化
while close 個數 max sub -a 最小值 成了 span 1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4112 Solved: 1577 [Submit][
BZOJ_3174_[Tjoi2013]拯救小矮人_貪心+DP
script 希望 深度 sca rip pan main mem 是我 BZOJ_3174_[Tjoi2013]拯救小矮人_貪心+DP Description 一群小矮人掉進了一個很深的陷阱裏,由於太矮爬不上來,於是他們決定搭一個人梯。即:一個小矮人站在另一小矮人
洛谷 P3049 Landscaping ( 貪心 || DP)
cor turn name line while bits ide spa con 題意 : 有n塊土地,每塊有A[i]泥土,現把其改造成B[i]泥土,有3種操作:(1)花費X向任意土地增加1泥土;(2)花費Y向任意土地減少1泥土;(3)花費Z*|i-j|把土地i的1泥土運
題解——[APIO2015]巴厘島的雕塑 貪心+DP+特殊數據優化
ret div 沒有 最大 set ongl 每次 亂搞 api 寫了好久。。。。剛剛調了一個小時各種對拍,,,,最後發現是多寫了一個等號,,,,內心拒絕表示一開始看真的是各種懵逼啊在偷聽到某位大佬說的從高位開始貪心後發現可做首先考慮小數據(因為可以亂搞)所以先從高位開始枚
uva 11367 (Dijkstra+DP)
優先隊列 ans ID oss 起點 amp 容量 汽車 push_back 題意:一輛汽車在一張無向圖中開告訴你每個城市加油的費用。每次給q個查詢(起點,終點,油箱容量)問你最小花費是多少。 思路:一道Dijkstra狀態的題目。在這種最短路問題中一維的dis數組記錄的
【貪心/DP/單調隊列】【CF1029B】Creating the Contest
swap cout const output i+1 隊列 octopus 描述 ++i Description 給你一個單調不下降的長度為n的序列,請你找出一個最長的子序列,滿足找出的子序列中,\(A_i<=A_{i-1}~\times~2\),其中i為下標,A為找
luogu2577/bzoj1899 午餐 (貪心+dp)
div pac stdin pri def for str clu n) 首先,應該盡量讓吃飯慢的排在前面,先按這個排個序 然後再來決定每個人到底去哪邊 設f[i][j]是做到了第i個人,然後1號窗口目前的總排隊時間是j,目前的最大總時間 有這個i和j的話,再預處理出
[Poj2287][Tyvj1048]田忌賽馬 (貪心+DP)
div color ret 很多 nbsp algo 一道 include money 瞎扯 很經典的一道題 考前才打 我太菜了QAQ 就是先貪心排序了好 然後在DP 這樣比直接DP更容易理解 (其實這題做法還有很多) 代碼 1 #include&l
Erasing and Winning UVA - 11491 貪心
題目:題目連結 思路:不難發現,要使整體儘量大,應先滿足高位儘量大,按這個思路優先滿足高位即可 AC程式碼: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #inc
[APIO2015]巴厘島的雕塑[按位貪心+dp]
-s rep turn inf back esp 可能 clas using 題意 給你長度為 \(n\) 的序列,要求分成 \(k\) 段連續非空的區間,求所有區間和的 \(or\) 最小值。 分析 定義 \(f_{i,j}\) 表示前 \(i\) 個點分成 \(j\)