数学建模社区-数学中国

标题: 2006 年百度之星程序设计大赛初赛题目 1 [打印本页]

作者: 厚积薄发    时间: 2010-5-6 18:56
标题: 2006 年百度之星程序设计大赛初赛题目 1
饭团的烦恼 5 d) w7 G' m) g* e

/ y1 B4 j% k# F/ v0 b* L“午餐饭团“是百度内部参与人数最多的民间组织。
# l6 b. P) i- |! n9 Q0 U7 [  V# x* g: p( G
同一个部门的,同一间大学的,同一年出生的,用同一种型号电脑的,员工们总是以各种理由,各种借口组织各种长久的,临时的饭团。 3 r/ s+ j/ ~; R

* m( f: R) K/ T  d  R7 e参加饭团,不仅可以以优惠的价格尝到更加丰富的菜式,还可以在吃饭的时候和同事们唠唠嗑,吹吹水,增进感情。
4 W, |# A# j7 }" _' U
- L& Z8 g: ]/ |8 H5 g但是,随着百度的员工越来越多,各个饭团的管理随即变得烦杂。特别是为了照顾员工们越来越挑剔的胃口,饭团的点菜负责人背负的责任越来越大。现在,这个重担落在百度之星的肩上,因为,你们将要为所有的百度饭团设计一个自动点菜的算法。
9 ]8 P3 U: e3 Q5 I1 M  f. A+ H* S' P
饭团点菜的需求如下: ' P" [! }% |" m+ T0 K8 Z2 W
  J! p& l* F3 S# n* y" K
1 . 经济是我们要考虑的一个因素,既要充分利用百度员工的午餐补助,又不能铺张浪费。因此,我们希望最后的人均费用越接近 12 元越好。 4 ?7 e# e5 y9 I$ r8 @. S

7 z( u. Y( f, u2 . 菜式丰富是我们要考虑的另一个因素。为简单起见,我们将各种菜肴的属性归结为荤菜,素菜,辛辣,清淡,并且每个菜只能点一次。
. P5 @4 _0 l1 [0 E3 J! o+ J1 n  m
/ x  j( S( Z! ^' C: p3 . 请紧记,百度饭团在各大餐馆享受 8 折优惠。
5 Z1 B" V# B& s8 d/ }1 t% \9 Q" f2 k
输入数据描述如下: # N/ H8 C. x  O/ [0 p* {
3 D* s2 z$ L& y1 L8 o
第一行包含三个整数 N , M , K ( 0<N<=16 , 0<M<=N , 0<K<=12 ),分别表示菜单上菜的数目,饭团需要点的菜的数目,就餐的人数。 : Q8 y& p! ?& a( F

- U/ @( Z% c9 A9 A紧接着 N 行,每行的格式如下: 6 a% Y, N8 V3 `7 }/ ^# i& C
* e3 i# u4 l; F8 |' `1 K. U9 _6 Y
菜名(长度不超过 20 个字符) 价格(原价,整数) 是否荤菜( 1 表示是, 0 表示否) 是否辛辣( 1 表示是, 0 表示否) ) m0 K8 y5 q$ N/ I

0 a$ c; c8 h& r/ ]! K& a例: 8 v" [- C/ j% O/ i

5 g. p/ V; Z# p2 W. d3 Y9 \( D水煮鱼 30 1 1 $ k# \' c& Q6 q4 H# |

+ Z( h# l2 u/ {% g& a  d/ q7 [紧接着是 a b c d 四个整数,分别表示需要点的荤菜,素菜,辛辣,清淡菜的数目。 - k, p2 b# Q3 {$ y$ O
/ n0 ^4 Z, B( m* d1 U
输出数据:
0 [, T& t6 v, @; L; R* P3 @" v- i  U- }& e& T! e# _# v  K
对于每一测试数据,输出数据包含 M+1 行,前 M 行每行包含一个菜名(按菜名在原菜单的顺序排序)。第 M+1 行是人均消费,结果保留两位小数。
! X8 ^+ z' _# O
3 H- p/ l  C" u, d& s! a  |说明:
! I9 X6 Q5 m; O- y) |. @* Y! j- V% K; z) E$ X- N! T
1 .结果菜单的数目应该恰好为 M ,荤菜,素菜,辛辣,清淡菜的数目恰好为 a , b , c , d 。在满足这样的前提下,选择人均消费最接近 12 元的点菜方案。题目数据保证有且仅有一个解。 5 n! R3 ]0 L: Z' b# M

. z- [5 T: g2 k$ M, T2 j/ ~2 .每组测试数据的结果用一个空行隔开。末尾不要有多余的空行。
( i8 N7 ^  k8 b- `) ~3 j& g# k+ f' ~% X/ h
输入样例


7 p( j8 g( {- j/ D3 2 2
) r3 _% D& T) ^5 `0 U) L
" X$ B* C# k( |) R水煮鱼 30 1 1
# n; z. g# |2 Y1 n+ g
& I( {1 q2 l2 H6 V7 H& m口水鸡 18 1 1
+ @4 e$ ~/ W: P; M9 d( ]$ ]: @7 X$ J% [; a  l8 A% U
清炖豆腐 12 0 0
, K: y( \- l/ G& _( Z# o/ W4 k
' ^& f2 L, U6 ^6 ^5 c1 T1 1 1 1
& j2 ], v4 O- l: o4 {1 N+ k


/ q% v, p$ q5 Q
7 ~1 Y6 W6 K, k输出样例

" j7 [7 Y+ ?' [. m. N! c9 Z
口水鸡
7 c8 G' }( K( {! H$ z! |& n; U0 x' p
清炖豆腐 8 L0 w* [7 w/ b' t

: C" z* w* w7 L+ x) {% q12.00
3 I, G0 }$ o- W; v


4 M5 N8 \+ S( K& k, j
8 t+ |6 ^$ W4 a* x! V
9 e# P: e; @/ L- N. b时间要求: 1S 之内
" n4 Z$ {4 P1 r2 e
. ?# x, G' [- e2 Texample:
% P# P, I4 [7 F#include <cstdlib>
0 E9 @3 ^6 Y) }# }, i+ Z( e- k  q7 {#include <iostream># u" Y4 }, n: z/ ~/ H0 E
; e8 R( H7 @8 u
using namespace std;
$ d( D! d! \3 c/ M% k$ f
6 z% S9 Z0 t6 R! V( j: K1 j" s, F* C! I4 j# {% s  o9 o1 k3 k% \- p
struct cai. O! C# a2 v* {9 U8 F
{8 n+ A4 w5 h; n, P6 C
       string cainame;5 R- l/ p7 I6 q
       int price;
5 |- D8 H+ _2 a2 H% D       int hun;
3 t$ ]) t1 \9 V       int la;" D6 y" x/ v- k  z
       };7 {6 O# p8 B$ u* `, K4 K! n9 S
int* alltotal=new int[30];
& h1 |2 `( x# ]int pos=0;, `* p( U) l: b6 T9 T
cai* pcai; - ?9 J: s- ^1 ~7 Q% }1 g6 O
int N=3;  . G# {% |6 I' D) O* U
void fun(int * select,int n,int M,int a,int b,int c,int d,int total);
2 B6 `& i1 A1 k1 G9 h- B* `8 A3 Qint main(int argc, char *argv[])
) @9 \- H1 T, S  M{
; m) r- k" w; K0 C6 n    int M=2,K=2;. o# K+ U( Q$ t1 U. d% e% ]
    int a=1,b=1,c=1,d=1;) O  a: |+ f8 ~) G" K0 P
    pcai = new cai[N];
, x- _3 \- K. `* |- o) ~    pcai[0].cainame="water fish";& [4 O1 ]- {0 T
    pcai[0].hun=1;
/ Q8 d/ t8 s8 v4 p, i& h    pcai[0].la=1;
1 m4 o& ~, g3 X0 |& {, B    pcai[0].price=30;
( E1 V0 S$ u: \5 g. c3 v" U3 }    pcai[1].cainame="mouth fish";
* w# }. g7 z6 d    pcai[1].hun=1;
8 m. B* a  k% B+ K) v( R    pcai[1].la=1;8 ~+ T# q; |$ v5 s: b) A
    pcai[1].price=18; 0 e/ X0 N- F& `- z
    pcai[2].cainame="doufu";
% J3 I  b4 w9 X, w+ x7 \    pcai[2].hun=0;4 ]( ?% ]/ R- H: X( j7 h6 W" ?4 F
    pcai[2].la=0;6 G6 \7 v; p  ]9 |' I2 L7 s
    pcai[2].price=12;
  B/ ]. ^, a# }    for(int i=0;i<N;i++)
$ a! p7 F7 v7 T# c# T6 O    {
( j( V1 H1 y5 N! y0 U( h. h; B8 b3 [        if( (pcai.hun==1 && a>0) ||(pcai.hun==0 && b>0) || (pcai.la==1 && c>0) || (pcai.la==0 && d>0))' b5 n7 P2 e7 l/ k
        {/ l4 ]$ X: C9 Z) U
        int ta=a,tb=b,tc=c,td=d;    7 e# K3 j( Q: Z7 D
        int* select=new int[1];    % i; ?$ g7 S. f, [+ F4 J% V4 T
        select[0]=i;1 H8 y$ r$ m8 X# l  I, ^
        if(pcai.hun==1)ta--;else tb--;
& f6 q1 A. }3 d3 c9 ^% w4 ]        if(pcai.la==1)tc--;else td--;0 K0 M/ R+ j' C1 n
        fun(select,1,M-1,ta,tb,tc,td,pcai.price);) [' ~3 P1 q, W" v. z! h8 `  I# N/ K
        delete[] select;! t( U$ r2 ^, `  M! m+ a$ e! p
        }2 G* y! N& O: }6 P9 L
    }
$ a5 `9 o. c! \) t; G    for(int i=0;i<pos;i++)8 @; M! M* A! {  E  ~, P- F
    cout<<alltotal<<endl;
0 j, g# H1 g% X    delete alltotal;
- N* H7 ^! n1 x: D' A* j    delete []pcai;
# J$ b8 }. _% @8 b& }    system("PAUSE");
# l2 N  t( B2 T    return EXIT_SUCCESS;
% k. l0 l1 a; {}
! f0 s  G8 h0 Z% Q) i0 Uvoid fun(int * select,int n,int M,int a,int b,int c,int d,int total)& I" Y: z% ?6 b9 t( e9 L
{
1 q  S4 l( F, ~% e/ V% m1 W    //if(a<=0&&b<=0&&c<=0&&d<=0)return 0;* o7 R' S4 X5 h
    //getchar();
6 `& \2 g9 E, H4 P& a  r$ Z    //cout<<n<<"|"<<M<<"|"<<a<<"|"<<b<<"|"<<c<<"|"<<d<<"|"<<total<<"|"<<endl;5 G/ d, [3 C1 F( L1 q2 d! ^: F
    if(M<=0 && (a>0||b>0||c>0||d>0)){cout<<"impossible"<<endl;return;}
0 E1 H. d. h- k3 v    if(M<=0 && (a<=0&&b<=0&&c<=0&&d<=0)){cout<<total<<endl;alltotal[pos++]=total;return;}3 k5 V; U& {0 p- [
    for(int i=select[n-1];i<N;i++)
% r) H& T% H: `! Q/ l+ l    {4 B7 n* N  h4 y; L. F
         for(int j=0;j<n;j++)if(select[j]==i)continue;: U( I6 a: p! N& A- r$ X. N
        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))
3 X$ ^# H& {2 `( s6 b5 y        {
, U. h# G0 x9 |. A8 n        int ta=a,tb=b,tc=c,td=d;, j" D( N& T2 y( m+ t8 c0 f7 ?- r
        int* myselect=new int[n+1];   
* |' o/ b. l  R1 Q; z& g# B        for(int k=0;k<n;k++)myselect[k]=select[k];  T) j2 e* q# ^& r  n
        myselect[n]=i;
. G* R8 b: P9 A& O        if(pcai.hun==1)ta--;else tb--;
! e5 M9 L' X* I( ~9 D: {        if(pcai.la==1)tc--;else td--;" E5 S0 I% ]5 B( Q
        fun(myselect,n+1,M-1,ta,tb,tc,td,total+pcai.price);
, f+ R) U( W( u+ y$ Y. g# ~- B        delete[] myselect;
; I2 G& C2 p4 P; A        }% r- l9 c) L8 q# Z5 R; r+ w+ V3 F
    }6 C( m( W# C* f
}
作者: 928171481    时间: 2010-10-9 17:09
嗯,不错不错




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5