1. 程式人生 > >18.03.20 vijos1059積木城堡

18.03.20 vijos1059積木城堡

ont log numbers 系列 font lba close span 依次

描述

XC的兒子小XC最喜歡玩的遊戲用積木壘漂亮的城堡。城堡是用一些立方體的積木壘成的,城堡的每一層是一塊積木。小XC是一個比他爸爸XC還聰明的孩子,他發現壘城堡的時候,如果下面的積木比上面的積木大,那麽城堡便不容易倒。所以他在壘城堡的時候總是遵循這樣的規則。

小XC想把自己壘的城堡送給幼兒園裏漂亮的女孩子們,這樣可以增加他的好感度。為了公平起見,他決定把送給每個女孩子一樣高的城堡,這樣可以避免女孩子們為了獲得更漂亮的城堡而引起爭執。可是他發現自己在壘城堡的時候並沒有預先考慮到這一點。所以他現在要改造城堡。由於他沒有多余的積木了,他靈機一動,想出了一個巧妙的改造方案。他決定從每一個城堡中挪去一些積木,使得最終每座城堡都一樣高。為了使他的城堡更雄偉,他覺得應該使最後的城堡都盡可能的高。

任務:
請你幫助小XC編一個程序,根據他壘的所有城堡的信息,決定應該移去哪些積木才能獲得最佳的效果。

格式

輸入格式

第一行是一個整數N(N<=100),表示一共有幾座城堡。以下N行每行是一系列非負整數,用一個空格分隔,按從下往上的順序依次給出一座城堡中所有積木的棱長。用-1結束。一座城堡中的積木不超過100塊,每塊積木的棱長不超過100。

輸出格式

一個整數,表示最後城堡的最大可能的高度。如果找不到合適的方案,則輸出0。

樣例1

樣例輸入1

2
2 1 –1
3 2 1 –1

樣例輸出1

3
提示

原數據有誤,不知我修正後是不是對?

來源

NlogN年之前浙江省隊選拔第X輪

技術分享圖片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <string.h>
 6 
 7 using namespace std;
 8 
 9 const int maxn=10000;
10 int f[maxn+1],now[maxn+1];
11 
12 int main()
13 {
14     int n;
15 for(int i=0;i<=maxn;i++) 16 f[i]=1; 17 scanf("%d",&n); 18 for(int i=1;i<=n;i++){ 19 memset(now,0,sizeof(now));now[0]=1; 20 int x=0; 21 while(1) 22 { 23 scanf("%d",&x); 24 if(x==-1) 25 break; 26 for(int h=maxn-x;h>=0;h--) 27 if(now[h]) 28 now[h+x]=1; 29 } 30 for(int j=0;j<=maxn;j++) 31 f[j]&=now[j]; 32 } 33 for(int i=maxn;i>=0;i--){ 34 if(f[i]) 35 { 36 printf("%d\n",i); 37 return 0; 38 } 39 } 40 return 0; 41 }
View Code

思路:求出每個城堡在抽去若幹塊以後可以達到的高度,然後與目前已計入城堡可達到的高度進行與計算

IDE上沒法正常運行是只有我一個人嗎?-?把maxn改很小也不行,什麽情況,debug都沒法用

18.03.20 vijos1059積木城堡