vijos P1020 切蛋糕

P1020切蛋糕

描述

Facer今天買了n塊蛋糕,不料被信息組中球球等好吃懶做的傢伙發現了,沒辦法,只好浪費一點來填他們的嘴巴。他答應給每個人留一口,然後量了量每個人口的大小。Facer有把刀,可以切蛋糕,但他不能把兩塊蛋糕拼起來,但是他又不會給任何人兩塊蛋糕。現在問你,facer怎樣切蛋糕,才能滿足最多的人。(facer的刀很強,切的時候不會浪費蛋糕)。

格式

輸入格式

第一行n,facer有n個蛋糕。接下來n行,每行表示一個蛋糕的大小。再一行一個數m,爲信息組的人數,然後m行,每行一個數,爲一個人嘴的大小。(1<=n<=50, 1<=m<=1024)

輸出格式

一行,facer最多可以填多少張嘴巴。

樣例1

樣例輸入1[複製]

4
30
40
50
25
10
15
16
17
18
19
20
21
25
24
30

樣例輸出1[複製]

7


/*
1、在輸入的時後,記錄下麪包總面積之和
2、剪去麪包不能填到的人
3、只要是在可能填滿的人中,用深度遍歷搜索
4、若是沒有剩餘或者與上一次搜索結果相同,則剪枝


*/




#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>


using namespace std;


int cmp(const void *a , const void *b)
{
return ( *(int *)a - *(int *)b) ;
}


int pack[50 + 1] , rail[1024 + 1] , N ,  M ,  total = 0 ,  sumr[1024 + 1] , space ,   Mid ,  bag[50 + 1]; 
// 麪包數據  人口數據      麪包數 人口數 麪包面積總和  人口徑之和    剩餘量 測量深度  麪包數據備份
// M-1個的人和  層數


bool Dfsid(int deep , int pos)
{
if (deep <= 0) return true ;
if (space > total - sumr[Mid]) return false ;
for (int i = pos ; i <= N ; i++)
if (bag[i] >= rail[deep])
{
bag[i] -= rail[deep] ;
if (bag[i] < rail[1])
space += bag[i] ;
if (rail[deep] == rail[deep - 1])
{
if (Dfsid(deep - 1 , i)) return true ;
}
else if (Dfsid(deep - 1 , 1)) return true ;
if (bag[i] < rail[1])
space -= bag[i];
bag[i] += rail[deep] ;
}
return false ;
}


int main()
{
int i,len; 
scanf("%d",&N);
for (int i = 1 ; i <= N ; i++)
{
scanf("%d",&pack[i]);
total += pack[i] ;//記錄麪包的總面積 
}
scanf("%d",&M);
for (int i = 1 ; i <= M ; i++)scanf("%d",&rail[i]);

//快排 
sort(pack,pack+N+1);
sort(rail,rail+M+1); 

for(i=1;i<=M;i++)if(rail[i]>pack[N])break;
len=i-1;

sumr[0] = 0 ;//記錄口徑的總和
for ( i = 1 ; i <= len ; i++) sumr[i] = sumr[i - 1] + rail[i] ;

while (sumr[len] > total) len--;//剪除不能實現的口徑


int Left = 1 , Right = len ;
Mid = ((Left + Right) >> 1 ) ;


while (Left <= Right)
{
for (int i = 1 ; i <= N ; i++) bag[i] = pack[i] ;//備份 
space = 0 ;//清零 
if (Dfsid(Mid , 1))
{
Left = Mid + 1 ;
Mid = ((Left + Right) >> 1);
}
else
{
Right = Mid - 1 ;
Mid = ((Left + Right) >> 1);
}
}
printf("%d\n",Mid);
return 0 ;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章