題目傳送門
【題目大意】
有6種規格的物品,分別是$6*6,5*5,4*4,3*3,2*2,1*1$,高度均為$h$,先有一種高為$h$,規格為$6*6$的包裹可以裝物品,求最少需要多少個包裹可以裝下所有物品。
【思路分析】
分類討論一下:
1.$6*6$的物品每個都要乙個包裹
2.$5*5,4*4$的物品每個包裹也只能裝乙個,但要記錄餘下的空間可以存放幾個$1*1$和$2*2$的物品
3.$3*3$的物品每個包裹可以裝4個,對於每個箱子裡裝了不同個$3*3$的物品的情況,可以存放不同個數$2*2$的物品,也要記錄
4.先把前面所有可以放$2*2$的物品的位置裝完,然後如果有剩餘,再另開箱子
5.先把前面所有的空餘位置裝完,然後如果有剩餘,另開箱子存放$1*1$的物品
很多細節部分要注意,詳見**。
【**實現】
1 #include2 #include3 #include4 #include5 #include6**戳這裡#define g() getchar()
7#define rg register
8#define go(i,a,b) for(rg int i=a;i<=b;i++)
9#define back(i,a,b) for(rg int i=a;i>=b;i--)
10#define db double
11#define ll long long
12#define il inline
13#define pf printf
14using
namespace
std;
15int
fr()
22while(ch>='
0'&&ch<='
9') w=(w<<1)+(w<<3)+ch-'
0',ch=g();
23return w*q;24}
25int num[7],a1=0,a2=0,ans=0,tag[4]=;
26//
tag記錄的是放了i個3*3的物品之後,還能放多少個2*2的
27int
main()
37if(!end) break
;38 back(i,6,1)41
if(i==5) //
a1記錄可以放多少個1*1的物品
42if(i==4) //
a2記錄可以放多少個2*2的物品
43if(i==3)50
}51if(i==2
)53 num[i]-=a2;a2=0
;54 rg int add=ceil(1.0*num[i]/9);ans+=add;
55if(add*9>num[i]) a1+=(add*9-num[i])*4;56
}57if(i==1
)60 num[i]-=a1;
61 rg int add=ceil(1.0*num[i]/36);ans+=add;62}
63}64 pf("
%d\n
",ans);65}
66return0;
67 }
poj1017 貪心 思維 好題
題意 運輸公司有6種規格的物品各若干件 1 1 2 2,3 3 4 4,5 5,6 6的,這六種物品都要放在6 6的箱子裡運輸,讓你求出最少用多少個箱子。解題思路 有兩種方法來做,第一種特別繁瑣,也是最直接的解決方式,那就是根據常識來貪心並模擬,量很大,另一種和這個貪心乙個思路,實現的時候非常簡便,...
POJ 1017 貪心模擬
因為4 4,5 5,6 6的必須單獨放,所以先開闢這三個的盒子,然後往裡面新增1 1和2 2的 對於5 5的只能填1 1的,乙個已經塞了5 5的盒子可以填11個1 1的格仔 對於4 4的,先填2 2的,再填1 1的 然後再為3 3的開闢新盒子,每四個可以放乙個盒子,不足四個的再新開闢乙個,然後往裡面...
貪心 模擬 poj 1017
題目大意 有1 1,2 2,3 3,4 4,5 5,6 6的產品若干個,問最少需要用多少個6 6的包裝盒把所有的產品都裝好。解題思路一 顯然6 6,5 5,4 4的產品每次只能放乙個,且放完後只能放1 1的產品。對於3 3的格仔,設定陣列lim i j 表示放了i個j j的產品後最多還能放多少個2 ...