饭团的烦恼
( |/ o! |# K$ \$ Z
$ A X* o. F6 v, e [) L. v5 {4 U4 Q5 o“午餐饭团“是百度内部参与人数最多的民间组织。
: t; A. p7 Q: Z
n a1 T9 o9 }: a2 X/ {9 h同一个部门的,同一间大学的,同一年出生的,用同一种型号电脑的,员工们总是以各种理由,各种借口组织各种长久的,临时的饭团。
9 f0 B+ W) v' F
. _; Z' ^$ \. v( h2 o9 ?参加饭团,不仅可以以优惠的价格尝到更加丰富的菜式,还可以在吃饭的时候和同事们唠唠嗑,吹吹水,增进感情。
: `7 i: x3 W b H. }% p w
$ z9 ~; m# z5 }/ {' N+ \) @: T但是,随着百度的员工越来越多,各个饭团的管理随即变得烦杂。特别是为了照顾员工们越来越挑剔的胃口,饭团的点菜负责人背负的责任越来越大。现在,这个重担落在百度之星的肩上,因为,你们将要为所有的百度饭团设计一个自动点菜的算法。 7 u# x! h1 t* {( n' T% q
4 ~" ] L- Q) H W: q饭团点菜的需求如下: / I7 t, G& X, r# U
: Q+ D M8 ]8 H1 . 经济是我们要考虑的一个因素,既要充分利用百度员工的午餐补助,又不能铺张浪费。因此,我们希望最后的人均费用越接近 12 元越好。 & F% R M& A+ l- f4 k$ w6 \
: J) z1 O8 v* I2 v8 Z$ K
2 . 菜式丰富是我们要考虑的另一个因素。为简单起见,我们将各种菜肴的属性归结为荤菜,素菜,辛辣,清淡,并且每个菜只能点一次。
$ ^6 \. Z$ b; n/ g% {: {+ }- N* U- p& l3 y2 ~9 B
3 . 请紧记,百度饭团在各大餐馆享受 8 折优惠。 ' D7 v3 t3 s9 b- b7 G
6 C+ M" [" |6 U1 \2 z, s输入数据描述如下:
" p: u* G; ?: v; m4 o8 q' |' E1 O. Y. F1 J5 |1 M' a
第一行包含三个整数 N , M , K ( 0<N<=16 , 0<M<=N , 0<K<=12 ),分别表示菜单上菜的数目,饭团需要点的菜的数目,就餐的人数。 7 n4 l' H2 B6 Z7 N6 }
! u, K; {6 U( K" \! l H
紧接着 N 行,每行的格式如下:
" c/ D6 z2 i( k5 A1 z
, h; L% {3 B! H( ~- E; c菜名(长度不超过 20 个字符) 价格(原价,整数) 是否荤菜( 1 表示是, 0 表示否) 是否辛辣( 1 表示是, 0 表示否) 6 ~% _8 a q) S' k' X( z4 j
. `' i' j, v( k/ m' i p/ A例: ' R& g7 m/ k" A3 T: g, j
0 Q6 y& g/ X" ] `" m, F
水煮鱼 30 1 1
9 T9 r5 E9 u2 i0 H9 ~5 l4 o) e- y; v( [8 n/ B6 J
紧接着是 a b c d 四个整数,分别表示需要点的荤菜,素菜,辛辣,清淡菜的数目。
$ x, Y6 ^, q2 X/ n
5 g0 H8 t+ {5 m. K# v. e9 G' {' J: t输出数据: ' e' I E5 E- F! g
o' L1 F; d2 s1 e% t" A* F+ @
对于每一测试数据,输出数据包含 M+1 行,前 M 行每行包含一个菜名(按菜名在原菜单的顺序排序)。第 M+1 行是人均消费,结果保留两位小数。 ! ]7 r0 C8 e; h" r
$ T5 n: ~0 m6 |+ v& Y1 M, t
说明:
' g, |6 B) b$ u/ |1 E5 S0 {
! b" s9 r' v9 E8 M/ E5 [" f1 .结果菜单的数目应该恰好为 M ,荤菜,素菜,辛辣,清淡菜的数目恰好为 a , b , c , d 。在满足这样的前提下,选择人均消费最接近 12 元的点菜方案。题目数据保证有且仅有一个解。
6 O+ e# Z0 z/ ~; [3 `8 [5 R2 O3 H; d I1 c R2 e0 C2 |
2 .每组测试数据的结果用一个空行隔开。末尾不要有多余的空行。
5 u2 O8 n6 m2 T7 d. U S1 Y, u- q0 V3 c x. ]* q7 k1 T( C1 l/ Q
输入样例
! v, X: T( h7 I1 j% n# V/ f3 2 2 ) |+ k* i9 n) P5 k7 [* N( y
. F( r: s6 s8 ~( h( J; d
水煮鱼 30 1 1
; p P( u9 V& k1 I# W/ N+ O: F* V# V3 T* m. F+ D+ M5 C
口水鸡 18 1 1 3 m4 `1 S4 I: |* Z% u2 A' j1 l
% W0 O* {4 D% O$ q9 k
清炖豆腐 12 0 0 , [* _% P& r, k7 F' [1 g
$ J, p% q. t' U- ?" o3 H! q& n1 1 1 1
2 p8 A9 c1 x6 l6 U+ n. a- t( j # g) h$ |' A" |* r3 r8 D" M1 w* U
9 t' E& h; e" G0 ?8 q输出样例
" @& R! n: x, a" p" J4 W口水鸡 0 ?% a5 ?. n& L, n' t" k
7 \( h, u3 f: A) \8 W; @% Z清炖豆腐
: |4 q; ~9 U6 I4 z3 {! _: n$ z( l y
8 C8 A1 q4 Q2 m" U12.00 , O( c Z. p* h* I0 m, x$ A
5 Q6 _! }3 S# c' |7 t \: J7 c# J
8 W7 v' [; [0 F, y
3 b) a) m7 c- t6 i7 ^时间要求: 1S 之内
3 m; ^ P: ^( L! O
7 X3 S) b6 Z. y9 f) @' Qexample:, V$ e' f6 m& }% I
#include <cstdlib>
4 z8 ]$ _) |- o& j* F#include <iostream>- e% h& a3 L- J6 { R; M
' a& T7 @6 U8 a0 o- P/ @2 V5 Wusing namespace std;4 z+ _- s1 x- L- z
) s& ~6 U) o4 y8 s& Y. g ^, @& z# V, ]0 @) g: }1 p
struct cai, J+ _1 t' {9 J! `
{
5 ?( x) S- Z: s- k/ \ g string cainame;
, a4 O1 n7 _6 D& {2 y+ | int price;
, y6 m. A ?5 q v5 l* K! k \ int hun;! a( m6 W3 p& @: q1 u
int la;
5 K. A$ }7 `1 k1 q1 e6 B };
" ^* J( |4 s% R8 N- F6 Q* T4 Dint* alltotal=new int[30];. f& `4 o; D+ l l( z2 \- X0 B% ]
int pos=0;1 x5 _8 D9 }, v) q1 B8 K
cai* pcai; $ V7 p7 k* C* M5 P
int N=3;
, c! |% ~0 k, G! x5 Y# d' Avoid fun(int * select,int n,int M,int a,int b,int c,int d,int total);3 e9 G# v7 p- S" d* `1 H
int main(int argc, char *argv[])
. {! H, {; ?2 l{; \' [9 K. Q8 g& g* r+ T
int M=2,K=2;
7 _0 F q% Z! P' ?/ P8 } int a=1,b=1,c=1,d=1;% q+ e6 ~$ S4 v
pcai = new cai[N];9 y3 F5 T8 `$ r9 j K( v' K
pcai[0].cainame="water fish";- K& q3 `) s+ R4 {8 k/ @
pcai[0].hun=1;) E+ J- @/ p* u! N" R4 l
pcai[0].la=1;: [7 T9 p: X7 r
pcai[0].price=30;7 `. {! M- ?+ ]8 i% @6 h
pcai[1].cainame="mouth fish";* j8 x }* v1 y& |3 C- d/ ?. m- a/ Z4 ?
pcai[1].hun=1;6 l$ Q5 V# }' A7 o" n
pcai[1].la=1;9 r9 m' x" D: {3 d* ^/ N7 v
pcai[1].price=18;
; I! I- [# Z N( |, y* g4 P pcai[2].cainame="doufu";
9 `3 z+ C3 ^# A( Q2 w pcai[2].hun=0;
; O6 Z K. u& G; ~/ G pcai[2].la=0;
4 r3 P# B! E5 f* [) B: V2 h pcai[2].price=12;
* ]( D. ^' K+ E/ }' v for(int i=0;i<N;i++)
$ g2 f" F9 j; j9 x1 W$ o {
1 x0 D* h% z9 y2 `1 q0 z if( (pcai.hun==1 && a>0) ||(pcai.hun==0 && b>0) || (pcai.la==1 && c>0) || (pcai.la==0 && d>0)) l$ `5 L" H! l/ U1 c
{4 _* N+ r; b: b1 F0 N; h
int ta=a,tb=b,tc=c,td=d;
5 q$ F' p7 Q: j int* select=new int[1]; ! n \+ P/ ~& }* |- h
select[0]=i;2 q: S- H( G) H, ^
if(pcai.hun==1)ta--;else tb--;
4 l& i" R# S6 K- E7 d if(pcai.la==1)tc--;else td--;
" c$ q3 N3 C2 {8 W( J5 R2 J5 P fun(select,1,M-1,ta,tb,tc,td,pcai.price);
- p. ?/ A( L" j2 q& @. o delete[] select;
# K* {' S$ L3 [2 D; q }$ _3 a. J8 \$ }/ ?* Y
}5 \' ? p, Y$ W' y8 r! q
for(int i=0;i<pos;i++)
! s& {2 j9 s7 J4 w cout<<alltotal<<endl;2 l& O- w; E& v6 {; @
delete alltotal;
/ J6 j: R s; D6 N( J/ }: D! f0 m delete []pcai;3 Z. m0 J+ Z+ W, s8 G' i
system("PAUSE");5 ~4 x" m) U( X" ^% L x. v4 C
return EXIT_SUCCESS;
# x1 S! U2 m+ m" q: I7 e. i}' Z. S) g4 b( X1 L, V, g1 B
void fun(int * select,int n,int M,int a,int b,int c,int d,int total)
. |. p! B9 f8 ~{6 T$ u/ C0 b4 l0 b$ x+ y7 E
//if(a<=0&&b<=0&&c<=0&&d<=0)return 0;
4 S4 [! W+ b7 s: \ //getchar();
- ]: q, l: p2 T7 X$ P //cout<<n<<"|"<<M<<"|"<<a<<"|"<<b<<"|"<<c<<"|"<<d<<"|"<<total<<"|"<<endl;9 @! l/ k* f$ C% _0 J+ l5 a% q" }
if(M<=0 && (a>0||b>0||c>0||d>0)){cout<<"impossible"<<endl;return;}. v/ ]0 h0 G( N/ H& E" v9 q0 J+ L' A0 W
if(M<=0 && (a<=0&&b<=0&&c<=0&&d<=0)){cout<<total<<endl;alltotal[pos++]=total;return;}
/ |# @! G2 J( B( z2 C% z- d for(int i=select[n-1];i<N;i++)# }; d2 j- e* @* I
{9 E$ S5 G G4 k6 ]
for(int j=0;j<n;j++)if(select[j]==i)continue;
/ J5 o% d4 d4 }, ]1 C1 B( A if( (a<=0&&b<=0&&c<=0&&d<=0) || (pcai.hun==1 && a>0) ||(pcai.hun==0 && b>0) || (pcai.la==1 && c>0) || (pcai.la==0 && d>0))& E9 @' F; l' N
{
! i6 z8 ]% l7 _! h: S7 ]# ] int ta=a,tb=b,tc=c,td=d;# n. k4 n8 K2 k/ k
int* myselect=new int[n+1];
. P! f. u1 Q' H for(int k=0;k<n;k++)myselect[k]=select[k];# r, ^1 ?+ B/ z; n" [
myselect[n]=i;4 {8 n. }& [! B( w" n, C4 h/ _
if(pcai.hun==1)ta--;else tb--;
) q- x6 n/ E* P* c0 N/ z8 S if(pcai.la==1)tc--;else td--;( r9 t( E% a( e/ E/ h
fun(myselect,n+1,M-1,ta,tb,tc,td,total+pcai.price);
) H0 A p+ |$ u, q t4 C( W1 [1 L: c. l# e delete[] myselect;
( Y$ G$ b H" X2 J, w) j }1 W7 p! ]3 r* S9 S! h" S! b
}$ H [* U, X0 `
} |