貪心 模擬 poj 1017

2022-09-23 11:39:10 字數 1891 閱讀 6008

題目大意:

有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*2的。

顯然lim[4][3]=0,lim[3][3]=1,lim[2][3]=3,lim[1][3]=5,lim[0][3]=9;  lim[1][4]=5;

max[i]表示當放i*i的產品時最多能放多少個。

然後每次從大往小放,有多的空間就盡可能的放2*2和1*1.注意有時2*2的產品數量比較少,此時可以放更多的1*1。

**:#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define eps 1e-6

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define ll __int64

#define ll long long

#define lson l,m,(rt<<1)

#define rson m+1,r,(rt<<1)|1

#define m 1000000007

#pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

#define maxn 10

int num[maxn];

int lim[maxn][maxn],max[maxn];

int main()

if(!flag)

break;

int ans=0;

for(int i=6;i>=2;i--)

} if(num[1]) //根據2*2的占用情況,新增1*1

} if(num[i]) //剩餘的

else

num[2]-=tt;

} if(num[1]) //1*1的可新增的個數

num[i]=0;

} } //1*1的單獨處理

if(num[1])

ans+=(num[1]%36)?(num[1]/36+1):(num[1]/36);

printf("%d\n",ans);

} return 0;

}   

解題思路二:

首先6*6,5*5,4*4的一次只能放乙個,這樣有多少個,就要用多少個包裝袋,3*3的最多可以放4個,所以需要(num[3]+3)/4個包裝袋,然後統計出空餘部分2*2的個數。顯然當放4*4時空出5個2*2,放3個3*3時,空出1個2*2;放2個3*3時,空出3個2*2;放1個3*3時,空出5個2*2;然後將2*2的全部搞定。最後用總的空間減去已放的空間就可以得到剩餘的1*1的空間。

a/b的向上取整可以寫為(a+(b-1))/b.

**:#include

int main()

; //當放i個3*3時,空出來的2*2的個數

while(1)

return 0;

}   

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 裝箱問題(貪心)

大意是只有6 6規格的箱子來裝 雖然是描述三維的,但因為高度相同,因此忽略掉 給你若干個從1 1到6 6規格的箱子,求所需最小箱子數。思路 很明顯應該利用貪心,即優先從最大規格的箱子數來考慮,然後因為在裝完較大規格的箱子後,該箱子可以存在剩餘空間,所以仍應該利用,且仍舊優先裝較小規格中較大的箱子。6...

poj1017 貪心 思維 好題

題意 運輸公司有6種規格的物品各若干件 1 1 2 2,3 3 4 4,5 5,6 6的,這六種物品都要放在6 6的箱子裡運輸,讓你求出最少用多少個箱子。解題思路 有兩種方法來做,第一種特別繁瑣,也是最直接的解決方式,那就是根據常識來貪心並模擬,量很大,另一種和這個貪心乙個思路,實現的時候非常簡便,...