洛谷 P2530 SHOI2001 化工廠裝箱員

2021-07-15 15:05:53 字數 1557 閱讀 6600

題目描述

118號工廠是世界唯一秘密提煉鉲的化工廠,由於提煉鉲的難度非常高,技術不是十分完善,所以工廠生產的鉲成品可能會有3種不同的純度,a:100%,b:1%,c:0.01%,為了**方便,必須把不同純度的成品分開裝箱,裝箱員grant第1次順序從流水線上取10個成品(如果一共不足10個,則全部取出),以後每一次把手中某種純度的成品放進相應的箱子,然後再從流水線上順序取一些成品,使手中保持10個成品(如果把剩下的全部取出不足10個,則全部取出),如果所有的成品都裝進了箱子,那麼grant的任務就完成了。

由於裝箱是件非常累的事情,grant希望他能夠以最少的裝箱次數來完成他的任務,現在他請你編個程式幫助他。

輸入輸出格式

輸入格式:

第1行為n(1<=n<=100),為成品的數量

以後n行,每行為乙個大寫字母a,b或c,表示成品的純度。

輸出格式:

僅一行,為grant需要的最少的裝箱次數。

輸入輸出樣例

輸入樣例#1:

11 a

b c

a b

c a

b c a b

輸出樣例#1:

3【分析】

f[i][x][y][z]指流水線上剩餘i個產品,手裡有x個a,y個b,z個c時所需要的最少裝箱次數,顯然我們可以以此轉移三種狀態:裝箱a,裝箱b,裝箱c

【**】

//洛谷 p2530 [shoi2001]化工廠裝箱員 

#include

#include

#include

#define fo(i,j,k) for(i=j;i<=k;i++)

#define m(a) memset(a,0,sizeof a)

using

namespace

std;

int a[101],f[101][11][11][11],shu[3]; //a:第i組中 物品j的個數

int n;

bool flag[101][11][11][11];

char c;

inline

int dfs(int r,int x,int y,int z)

if(flag[r-k][x][y][z]) return f[r-k][x][y][z];

flag[r-k][x][y][z]=1;

if(r==k)

if(x) f[r-k][x][y][z]=min(f[r-k][x][y][z],dfs(r-k,0,y,z)+1);

if(y) f[r-k][x][y][z]=min(f[r-k][x][y][z],dfs(r-k,x,0,z)+1);

if(z) f[r-k][x][y][z]=min(f[r-k][x][y][z],dfs(r-k,x,y,0)+1);

return f[r-k][x][y][z];

}int main()

memset(f,0x7f,sizeof f);

printf("%d\n",dfs(n,0,0,0));

return

0;}

洛谷 P1434 SHOI2002 滑雪

michael 喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael 想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 1...

洛谷P1434 SHOI2002 滑雪

michael喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 5 16 17 ...

洛谷 P1434 SHOI2002 滑雪

題目傳送門 michael 喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待公升降機來載你。michael 想知道在乙個區域中最長的滑坡。區域由乙個二維陣列給出。陣列的每個數字代表點的高度。下面是乙個例子 1 2 3 4 ...