標籤:des style blog color os io strong 資料
Description - 問題描述
XC的兒子小XC最喜歡玩的遊戲用積木壘漂亮的城堡。城堡是用一些立方體的積木壘成的,城堡的每一層是一塊積木。小XC是一個比他爸爸XC還聰明的孩子,他發現壘城堡的時候,如果下面的積木比上面的積木大,那麼城堡便不容易倒。所以他在壘城堡的時候總是遵循這樣的規則。
小XC想把自己壘的城堡送給幼兒園裡漂亮的女孩子們,這樣可以增加他的好感度(明明是增加後宮人數 Σ( ° △ °\|\|\|) )。為了公平起見,他決定把送給每個女孩子一樣高的城堡,這樣可以避免女孩子們為了獲得更漂亮的城堡而引起爭執。可是他發現自己在壘城堡的時候並沒有預先考慮到這一點。所以他現在要改造城堡。由於他沒有多餘的積木了,他靈機一動,想出了一個巧妙的改造方案。他決定從每一個城堡中挪去一些積木,使得最終每座城堡都一樣高。為了使他的城堡更雄偉,他覺得應該使最後的城堡都儘可能的高。
任務:
請你協助小XC編一個程式,根據他壘的所有城堡的資訊,決定應該移去哪些積木才能獲得最佳的效果。
(短評:花心的自作聰明的小逗逼)
Input - 輸入資料
第一行是一個整數N(N<=100),表示一共有幾座城堡。以下N行每行是一系列非負整數,用一個空格分隔,按從下往上的順序依次給出一座城堡中所有積木的棱長。用-1結束。一座城堡中的積木不超過100塊,每塊積木的棱長不超過100。
Output - 輸出資料
一個整數,表示最後城堡的最大可能的高度。如果找不到合適的方案,則輸出0。
Input/Output Example - 輸入/輸出範例輸入
22 1 -13 2 1 -1
輸出
3
據說這道題是原來浙江省選的題目(╯‵□′)╯︵┻━┻ ,你特麼確定不是在逗我!!!
這其實是一道簡單的背包問題.時間有點兒緊,200ms可過
(跪求大神給出50ms以下演算法!神犇Orz!!)
每座城堡的高度拿來動規求出拿走積木後可能的高度,再從上往下枚舉可能相同的高度,找到就輸出.
醜陋的代碼
#include "cstdio"int n,g[101][101],h[101],i,j,k,hs[101];int ht;bool f[101][10001],flag;void read(){scanf("%d",&n);for(i=1;i<=n;++i){j=1;while(scanf("%d",&k),k!=-1){h[i]+=(g[i][j]=k);++j;}f[i][0]=true;hs[i]=--j;}}int main(int argc, char const *argv[]){read();for(i=1;i<=n;++i){for(j=1;j<=hs[i];++j){for(k=h[i];k>-1;--k){f[i][k]=f[i][k]||f[i][k-g[i][j]];//if this height is reachable after removing some of the blocks}}}ht=20000;//of course, a number that is much bigger than the max height has been treated as INFfor(i=1;i<=n;++i){if(h[i]<ht){ht=h[i];//decrease ht to the min-height of the castels}}flag=true;//is not finished flagwhile(ht>0&flag){for(i=1;i<=n;++i){if(!f[i][ht]){//this test did not passedwhile(--ht,!f[i][ht]&&ht>0);//decrease ht to the nearest reachable height after removing blocksbreak;}else{if(i==n){//all tests are doneflag=false;//finished}}}}printf("%d", ht);//output maxreturn 0;}
似乎很短?
好醜,一定要去掉注釋和其他多餘代碼.
#include "cstdio"int n,g[101][101],h[101],i,j,k,hs[101];int ht;bool f[101][10001],flag;void read(){scanf("%d",&n);for(i=1;i<=n;++i){j=1;while(scanf("%d",&k),k!=-1){h[i]+=(g[i][j]=k);++j;}f[i][0]=true;hs[i]=--j;}}int main(){read();for(i=1;i<=n;++i)for(j=1;j<=hs[i];++j)for(k=h[i];k>-1;--k)f[i][k]=f[i][k]||f[i][k-g[i][j]];ht=20000;for(i=1;i<=n;++i)if(h[i]<ht)ht=h[i];flag=true;while(ht>0&flag)for(i=1;i<=n;++i)if(!f[i][ht]){while(--ht,!f[i][ht]&&ht>0);break;}elseif(i==n)flag=false;printf("%d", ht);return 0;}