饭团的烦恼
* @+ K0 a! u5 y, t+ B" ~" E6 D9 W
“午餐饭团“是百度内部参与人数最多的民间组织。 ( f/ e$ h$ j4 S2 R @: ]! \$ |
4 e+ ?0 h" L j7 B7 i( W: {同一个部门的,同一间大学的,同一年出生的,用同一种型号电脑的,员工们总是以各种理由,各种借口组织各种长久的,临时的饭团。
+ Q4 L* z8 l. p5 G/ u! {3 Y- V5 f, V
参加饭团,不仅可以以优惠的价格尝到更加丰富的菜式,还可以在吃饭的时候和同事们唠唠嗑,吹吹水,增进感情。 4 }- q0 [' n( M/ m# s2 G# r
5 Z" G' L" Q) g0 w% A( U" O2 E
但是,随着百度的员工越来越多,各个饭团的管理随即变得烦杂。特别是为了照顾员工们越来越挑剔的胃口,饭团的点菜负责人背负的责任越来越大。现在,这个重担落在百度之星的肩上,因为,你们将要为所有的百度饭团设计一个自动点菜的算法。 * Y" D+ |: H7 I' l/ _' A5 ~$ Y
8 B; D2 w* s# J7 n) h$ p8 ]饭团点菜的需求如下:
( F' w* p& L" a' h9 h- M9 v
/ l- `* z. g2 O1 o4 ]) d5 z' m1 . 经济是我们要考虑的一个因素,既要充分利用百度员工的午餐补助,又不能铺张浪费。因此,我们希望最后的人均费用越接近 12 元越好。 ; {# ]: h% P) D" N
. b8 m" @. m7 ?$ h. ^2 L
2 . 菜式丰富是我们要考虑的另一个因素。为简单起见,我们将各种菜肴的属性归结为荤菜,素菜,辛辣,清淡,并且每个菜只能点一次。
0 {- f% B( [' ~2 y5 g
x( _; v2 U+ O) p ~0 E9 I3 . 请紧记,百度饭团在各大餐馆享受 8 折优惠。
9 o* q2 b- w/ @8 C' q1 L
( `9 f" _( K7 W b: t! q输入数据描述如下:
( t: e5 A' F! h: T
' B6 E, ]9 F* Z+ c/ ?; n" |第一行包含三个整数 N , M , K ( 0<N<=16 , 0<M<=N , 0<K<=12 ),分别表示菜单上菜的数目,饭团需要点的菜的数目,就餐的人数。
3 g# z: l$ i7 `0 y
$ j0 n$ y% ^) K, w9 h! b" d紧接着 N 行,每行的格式如下:
6 K" d, N7 A' O% p1 {7 K
" r0 I0 y [/ T. K2 X- C/ v菜名(长度不超过 20 个字符) 价格(原价,整数) 是否荤菜( 1 表示是, 0 表示否) 是否辛辣( 1 表示是, 0 表示否) " q1 B5 M. e, r, N9 S
7 i9 K/ Z1 d* [7 Z
例: ' a/ j6 Z+ ^8 o7 c
# ?! o2 E: p& ]) u& O# H N; ~' A
水煮鱼 30 1 1
0 T6 e j& d/ U. j$ t5 W3 M2 |6 t# u* t6 f3 ?
紧接着是 a b c d 四个整数,分别表示需要点的荤菜,素菜,辛辣,清淡菜的数目。
1 d# T0 H3 Y/ y; j8 B3 ~: h7 u# m5 c3 `
输出数据:
& x/ ]/ q2 K: x0 ^0 @
; S- I2 Y3 [3 h9 v对于每一测试数据,输出数据包含 M+1 行,前 M 行每行包含一个菜名(按菜名在原菜单的顺序排序)。第 M+1 行是人均消费,结果保留两位小数。 Q6 q( i7 Q) c O! j9 }$ i
$ q( F r* s! [: \$ h) E; D7 L: Y说明: 0 M' U5 d* L2 m/ I$ z% W/ c; a
) {: T0 N, c8 `. P+ P! K
1 .结果菜单的数目应该恰好为 M ,荤菜,素菜,辛辣,清淡菜的数目恰好为 a , b , c , d 。在满足这样的前提下,选择人均消费最接近 12 元的点菜方案。题目数据保证有且仅有一个解。
. i! E ^! ~1 j; r) i& I) ?8 Q3 ?, U: x* W: N
2 .每组测试数据的结果用一个空行隔开。末尾不要有多余的空行。 ' d/ o$ S" F- i; y! z
5 D: Z( W8 u, ~, H$ s( z1 n6 \5 i输入样例
* \# u" {3 W. o; S5 S) J3 2 2
5 E* b1 O: a/ U" B( D8 l4 Z- a' S$ Q) k. K6 R
水煮鱼 30 1 1 & _. l" e) A" Z2 s+ r3 A/ D- }
2 S4 r( \7 I7 }- u R+ @* m口水鸡 18 1 1
. v2 z! |8 d8 g+ I% c( m% e$ S' T2 o- H
清炖豆腐 12 0 0
9 j% g+ u% Y# Q G1 m8 W: j% X) g( w* O! r5 T, R& ^, D6 Y1 X! \
1 1 1 1 ) y8 S/ k7 P6 e
, ^. B$ |, `8 J+ I8 F" a( C1 B1 S+ ^( t+ x. w) e
输出样例 / C2 t5 f7 }5 i) c! V
口水鸡 7 Y" i3 \. m! P
1 r% h/ s9 ?4 K2 B" Y清炖豆腐
( y v6 j! T) f, ~- O- o; b2 d0 Q& i. F
12.00
g0 N3 ~' r+ t" f# R6 q+ n" H5 J 6 z8 d- ^* R3 l7 n/ {
! S# Q; }+ X( _# K
$ @. ~9 t" X$ i2 f# g时间要求: 1S 之内 P3 b2 o( v! e! D& N5 h8 A! B4 y! j* h
( s8 H# Y2 P' P9 M( t
example:, O3 G/ W1 Y( ?0 P# i' `$ W2 e0 z
#include <cstdlib>
% a( b% G7 M. }, g- a& r#include <iostream>1 B' s, v3 { |9 |
1 {- w, b8 d' J5 @6 E& E
using namespace std;
0 ]. M' d/ {1 S$ F
2 `9 S1 ^# W" K2 W8 c
/ G% l9 N0 d! w7 e! I9 Nstruct cai
5 t c/ _+ N c( ]+ U{6 G0 w7 E# D8 X' k% G- L
string cainame;
2 w: O# @5 S' B( ?8 q* ~* K7 z: h int price;
- G p. C5 H$ r0 K' G int hun;4 }$ K; M5 i9 u3 a0 a1 S
int la;* K" p; T0 _8 P7 ^0 ~/ J' h/ t
};
8 K/ H( K& Y* F4 P5 i' @& {1 H2 [int* alltotal=new int[30];
# L! o7 B1 m+ gint pos=0;4 a Z% o: D: g# K6 ?) s3 u6 C
cai* pcai; ; d' k5 t) |1 c
int N=3;
$ z- V1 o& G. ~" Q1 rvoid fun(int * select,int n,int M,int a,int b,int c,int d,int total);8 a* X' h9 G. g) X
int main(int argc, char *argv[])& o% n* I5 \7 {) y: T
{
' @ f; j; y! {3 X8 e* D; ~" Z9 S int M=2,K=2;( j% P6 \. M( Q, G5 f7 s
int a=1,b=1,c=1,d=1;
! _9 @# b, m1 d* _! A/ e9 I pcai = new cai[N];
/ f2 |# F, X" T' N F* c" ` pcai[0].cainame="water fish";+ G6 J0 e3 q& x, n
pcai[0].hun=1;4 j2 f8 P E+ ] T* ^) w* m
pcai[0].la=1;# \/ d% s! ?6 M! T/ s4 I
pcai[0].price=30;
! F& ~2 C: u9 Q5 H pcai[1].cainame="mouth fish";6 M1 |9 h* `: z
pcai[1].hun=1;
) o( O7 M7 M- L; q; m/ a" u- z pcai[1].la=1;
$ I3 i) n1 c8 e7 @( j7 \ pcai[1].price=18; 1 N& G6 ~; U0 @" t, P4 X O* P
pcai[2].cainame="doufu";
" ^9 L) J ^" m2 _9 k" E+ j0 g- Q: Y pcai[2].hun=0;
8 G y Z. u4 c! w pcai[2].la=0;" `5 o# }3 o( U
pcai[2].price=12;
7 q+ @: ?% e8 i3 J! r5 O for(int i=0;i<N;i++)
O# p8 @2 x6 q3 i3 C& N {; W9 G3 b/ x4 S/ K
if( (pcai.hun==1 && a>0) ||(pcai.hun==0 && b>0) || (pcai.la==1 && c>0) || (pcai.la==0 && d>0))+ S7 ?+ Y0 X; B g4 b8 C/ \
{
" k7 ~4 i2 E# J+ K! i/ n int ta=a,tb=b,tc=c,td=d; 7 K& F+ ~ ~! X2 m
int* select=new int[1]; . G; X5 t7 ^' @
select[0]=i;3 w' N* @# w8 U7 Z' S; U8 A) c( N; K
if(pcai.hun==1)ta--;else tb--;
! ?2 U/ E8 N% C# e/ X% J, c if(pcai.la==1)tc--;else td--;
- L$ I1 `& G9 B) _ fun(select,1,M-1,ta,tb,tc,td,pcai.price);7 a* V( {) _1 C8 f8 K" A
delete[] select;
5 d& f9 b( [. A g# { }
. c8 U9 o+ O( J' P- A* b }7 F1 {3 _* ~; \0 X) X
for(int i=0;i<pos;i++)
! W2 F9 I2 ~* X9 L) k8 Y6 j0 X8 `" H cout<<alltotal<<endl;9 {* z2 k/ d& i0 a
delete alltotal;# x; L" {8 `( ]
delete []pcai;3 K: q- i$ j4 `+ h* d/ B
system("PAUSE");
& o' f4 Q. W8 w return EXIT_SUCCESS;
" z# l1 r& ~" A) z7 V$ \}
) T6 i2 o8 \4 [2 l$ E3 A2 Zvoid fun(int * select,int n,int M,int a,int b,int c,int d,int total)1 a. q Y# I P( c' ^; R: l# n
{
7 l6 F a. P& I) T# Q; V //if(a<=0&&b<=0&&c<=0&&d<=0)return 0;) T" z" G5 a& ]4 [
//getchar();
( l& G4 t" k$ \. }2 {4 k2 r. B //cout<<n<<"|"<<M<<"|"<<a<<"|"<<b<<"|"<<c<<"|"<<d<<"|"<<total<<"|"<<endl;: g' `. n$ e) U9 C: z
if(M<=0 && (a>0||b>0||c>0||d>0)){cout<<"impossible"<<endl;return;}
3 {9 w) j& N' X$ b2 c if(M<=0 && (a<=0&&b<=0&&c<=0&&d<=0)){cout<<total<<endl;alltotal[pos++]=total;return;}
) u8 y: U$ `) e9 C- Z b8 w for(int i=select[n-1];i<N;i++)* x* g- ]& ~7 D
{
6 Q3 H% f0 S; H* B- X for(int j=0;j<n;j++)if(select[j]==i)continue;
- |9 Q0 l% R- t+ {+ t 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))( R7 |# f/ F3 N! Z: x
{0 c: Q( M) i) L$ D9 H
int ta=a,tb=b,tc=c,td=d;
0 z; j+ [' Y# ?* g) d int* myselect=new int[n+1]; e& w: ]- n4 j
for(int k=0;k<n;k++)myselect[k]=select[k];
4 L6 s0 D: c+ j# P# x9 d myselect[n]=i;7 t& M0 a& ~9 _5 h
if(pcai.hun==1)ta--;else tb--;( Y Y) a* d, L& r6 e! _
if(pcai.la==1)tc--;else td--;+ v; s. F- H0 p7 s% y
fun(myselect,n+1,M-1,ta,tb,tc,td,total+pcai.price);8 x6 K1 y0 A+ x+ g" g& M
delete[] myselect;
, s3 E, e- S% P& K7 i }
9 q* \+ {& a' x* G }
* h) D1 {0 {) q) A; ?1 e} |