QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10898|回复: 1
打印 上一主题 下一主题

2006 年百度之星程序设计大赛初赛题目 1

[复制链接]
字体大小: 正常 放大

1341

主题

736

听众

2万

积分

数学中国总编辑

  • TA的每日心情

    2016-11-18 10:46
  • 签到天数: 206 天

    [LV.7]常住居民III

    超级版主

    社区QQ达人 邮箱绑定达人 元老勋章 发帖功臣 新人进步奖 原创写作奖 最具活力勋章 风雨历程奖

    群组2011年第一期数学建模

    群组第一期sas基础实训课堂

    群组第二届数模基础实训

    群组2012第二期MCM/ICM优秀

    群组MCM优秀论文解析专题

    跳转到指定楼层
    1#
    发表于 2010-5-6 18:56 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    饭团的烦恼   ~; @. L' z+ w

    " g) K( E+ O1 M3 P  q$ d: J“午餐饭团“是百度内部参与人数最多的民间组织。
    / C3 B. |2 z9 ]3 y% J  M5 P6 y: z0 O% H( b3 s4 m* [
    同一个部门的,同一间大学的,同一年出生的,用同一种型号电脑的,员工们总是以各种理由,各种借口组织各种长久的,临时的饭团。 0 w1 M+ z8 w1 ~+ k8 p, n
    + N; I6 f# J9 q1 J! f& X
    参加饭团,不仅可以以优惠的价格尝到更加丰富的菜式,还可以在吃饭的时候和同事们唠唠嗑,吹吹水,增进感情。
    " ?  n2 ^' n; P+ T& w2 }
    7 \  [: g) _  L3 U; |但是,随着百度的员工越来越多,各个饭团的管理随即变得烦杂。特别是为了照顾员工们越来越挑剔的胃口,饭团的点菜负责人背负的责任越来越大。现在,这个重担落在百度之星的肩上,因为,你们将要为所有的百度饭团设计一个自动点菜的算法。 - D5 M$ {" o  t4 d- C1 s

    ; e' N/ U$ J% x# I# z, ?% a' h0 ^饭团点菜的需求如下:
    - f7 Q0 w' U0 n7 [
    # ]& v8 x  l1 \# h' z7 \1 . 经济是我们要考虑的一个因素,既要充分利用百度员工的午餐补助,又不能铺张浪费。因此,我们希望最后的人均费用越接近 12 元越好。
    . |. Q+ d* b! o" e* y" Z/ Q6 z& @3 D" i2 d' C" R6 q
    2 . 菜式丰富是我们要考虑的另一个因素。为简单起见,我们将各种菜肴的属性归结为荤菜,素菜,辛辣,清淡,并且每个菜只能点一次。 + a, Z# I, {  c4 I7 a/ g

    , Z$ L$ v& r! n+ d. E3 . 请紧记,百度饭团在各大餐馆享受 8 折优惠。 $ {/ {$ D& f2 S$ R5 z- d: u) _
    + c- u: q1 L3 ~0 M+ k. p
    输入数据描述如下:
    " b* j$ r& |1 h' l/ B7 A
    ' J; }8 J. i! s% h# U6 ^5 k第一行包含三个整数 N , M , K ( 0<N<=16 , 0<M<=N , 0<K<=12 ),分别表示菜单上菜的数目,饭团需要点的菜的数目,就餐的人数。
    9 L/ ~: L# A4 c+ z3 M0 o- D" z+ U; l) b" R8 u9 h8 I7 h: B4 m
    紧接着 N 行,每行的格式如下:
    2 s+ P: a3 [4 j% K& h$ ~- b; r& }  [$ a) U( E
    菜名(长度不超过 20 个字符) 价格(原价,整数) 是否荤菜( 1 表示是, 0 表示否) 是否辛辣( 1 表示是, 0 表示否)
    3 J2 b' T% T$ c% w! @) y/ }7 b0 O5 V( U
    例:
    ! L- w( ~8 r' Z, \4 x5 Y
    2 ]" k/ G0 t% ]水煮鱼 30 1 1 ( k% j% P5 O* K  Q5 z

    ' b$ S. u& u; p/ m# `紧接着是 a b c d 四个整数,分别表示需要点的荤菜,素菜,辛辣,清淡菜的数目。 ) s0 i) u* I2 {. {

    ) \6 @- B: o6 X5 f  L! |输出数据:
    & {4 Q5 w& q* Y" ?# _" C- X5 t: R1 E- |) ^0 T( `. x
    对于每一测试数据,输出数据包含 M+1 行,前 M 行每行包含一个菜名(按菜名在原菜单的顺序排序)。第 M+1 行是人均消费,结果保留两位小数。 1 Y' T+ l+ v1 e

    * c; G' C/ u3 |/ k说明: , d/ S. P/ q8 Q# K; s8 R
    1 M/ P$ a3 n( v1 U# |$ \
    1 .结果菜单的数目应该恰好为 M ,荤菜,素菜,辛辣,清淡菜的数目恰好为 a , b , c , d 。在满足这样的前提下,选择人均消费最接近 12 元的点菜方案。题目数据保证有且仅有一个解。 % [: q2 k* x9 e" R

    2 X( Y" |* Z  I: ]1 {2 .每组测试数据的结果用一个空行隔开。末尾不要有多余的空行。
    * _# Y" ], X* K* j8 F5 Z3 x
    ! s: z. N: p# H: k4 I输入样例

    / ^' l! g, k. E5 z% y& ?, S
    3 2 2
    . y& B: P0 @) [9 t# \) g! i) `$ _& O* P
    水煮鱼 30 1 1 & x% [! o6 Z2 r+ n

    ; q- R) c+ f# x2 N- A口水鸡 18 1 1 ; J# i# L0 D( Q& p6 q( c
      R( M' B% i- E) o
    清炖豆腐 12 0 0
    5 `) v  h3 [. n
    ) n" u9 {, A) E; m: L1 1 1 1 9 G& ^0 ?6 q" Q* i6 M

    " S  [% |; O; U  x

    . c( \8 V2 ~" P7 ]8 ~* d  b输出样例

    5 g% V: \. W: Q& Q9 t0 S  b
    口水鸡
    6 \5 Z, G. m- L3 T) o' O# X2 z- g& |  j
    清炖豆腐 + ]3 s( Z3 e2 S4 n) o. g
    5 t8 H2 I) P4 n7 o1 z1 `' a
    12.00 # J# R! H% `# c" e6 \


    : e7 U; G+ u6 o% J
    $ h. {" r9 B; U+ d5 t4 P' b2 _9 V) m1 f
    时间要求: 1S 之内
    6 |! F5 T2 l2 G' [  _; M9 \
    " j9 ?8 H! f7 |- e& T% Fexample:
    & U0 C8 n* o$ S7 ~$ A7 ~#include <cstdlib>
    : m( E! B/ I6 v; {+ r, g#include <iostream>) i# O! D5 P! a/ L5 [6 F+ Y

    8 H( V3 i- h3 p" Rusing namespace std;
    % v2 l8 p7 d# U* A* l. F( J) j7 @( B- K4 W/ K

    , z6 b& V4 Y  C! B5 ^" dstruct cai5 t- K3 C) D; U+ T: w4 X) W" u
    {
    . L) z7 s: z- w' e, F' y" j6 J       string cainame;
    - A/ o( [+ W, p' u6 @       int price;
    9 V) ]! Y9 d5 G       int hun;* [( }! p# \& k  A
           int la;
    & u) h; T& C6 ^4 Q4 N  y       };
    , [) i7 {: c6 l# f0 Lint* alltotal=new int[30];8 Z8 y7 Z, l1 C& {) ^& J- x) Y
    int pos=0;
    ( j: J, q. B. q4 H: pcai* pcai;
    ) B0 K* J+ @% d$ Y) Sint N=3;  , o& U. Z. C! B) K
    void fun(int * select,int n,int M,int a,int b,int c,int d,int total);' c* P" ?: p/ q* N
    int main(int argc, char *argv[])
    % s1 l  L. f, e* |8 e{- r+ I7 {6 ?" B
        int M=2,K=2;& Z- `, P" m  [2 a0 P
        int a=1,b=1,c=1,d=1;: f5 [. v8 w) E. `* I- N4 v# P
        pcai = new cai[N];% |1 l9 ]& g+ `
        pcai[0].cainame="water fish";
    2 G6 Q, [  \+ ^+ \    pcai[0].hun=1;
    9 p$ Q+ s2 Z! x$ N    pcai[0].la=1;
    . n9 H4 ~* N+ T! K2 B; ~/ V    pcai[0].price=30;
    4 i) v6 |* p9 |$ h    pcai[1].cainame="mouth fish";
    5 l# `" x2 I7 l$ x$ ~4 r    pcai[1].hun=1;
    : E$ u7 x; B* }' H' ^. Q    pcai[1].la=1;. b$ f* I8 @- w  z
        pcai[1].price=18;
    ! m1 ]* i& b# o6 C    pcai[2].cainame="doufu";5 S  P7 |! J1 d
        pcai[2].hun=0;# J& d4 i/ R: k
        pcai[2].la=0;
    1 A1 P& O: E* I+ E7 a$ L    pcai[2].price=12;
    1 m. H" ]" o! M& R( F    for(int i=0;i<N;i++)
      n: j7 V: ^$ a. k  F7 P3 [7 ]/ }    {% X4 v( ~+ @, K' @8 \6 i
            if( (pcai.hun==1 && a>0) ||(pcai.hun==0 && b>0) || (pcai.la==1 && c>0) || (pcai.la==0 && d>0))% r5 q) H1 k6 F# q' M
            {3 S5 D( i8 x8 T+ g: N* b. z
            int ta=a,tb=b,tc=c,td=d;   
      ]! C' X: C0 x  n        int* select=new int[1];    ! g3 M7 s4 ~$ L5 n( Q) O, u
            select[0]=i;6 ^, ^' G6 l$ H" J& E, l6 e
            if(pcai.hun==1)ta--;else tb--;% P; ^) R9 M- k+ s* N5 X  H. _; m
            if(pcai.la==1)tc--;else td--;
    % z/ {0 \# Z: A8 ?6 ]        fun(select,1,M-1,ta,tb,tc,td,pcai.price);
    ( X8 G9 z+ g: S        delete[] select;
    : p. X6 I& @  n4 I        }) R0 L4 u& G7 y/ l- D
        }' {1 F' ]2 m( k$ @) C. C
        for(int i=0;i<pos;i++)
    % I9 Z/ W) S* o5 |3 o2 B3 L    cout<<alltotal<<endl;
    1 Q, o4 C( b- I5 |    delete alltotal;2 `6 `1 {$ p, M# q2 q: \
        delete []pcai;7 S! t/ O1 }! G) ]3 e# R
        system("PAUSE");. _. N6 \7 A2 q% S$ d
        return EXIT_SUCCESS;
    5 E# t! P/ w7 A+ q+ q) D. l' p! R}
    + [$ W. x! w$ Q* s7 j: bvoid fun(int * select,int n,int M,int a,int b,int c,int d,int total)
    0 s% u& c4 h. w% E+ t' J# i{
    + Z. Z5 _" V  t7 H+ B3 ^    //if(a<=0&&b<=0&&c<=0&&d<=0)return 0;
    ' Q" u$ W2 E/ i5 C    //getchar();/ L: |# p. U, @0 t  _, \: C) m: u2 s5 I
        //cout<<n<<"|"<<M<<"|"<<a<<"|"<<b<<"|"<<c<<"|"<<d<<"|"<<total<<"|"<<endl;
    7 V& t- N3 F& K/ a7 k    if(M<=0 && (a>0||b>0||c>0||d>0)){cout<<"impossible"<<endl;return;}
    1 p& W' N1 R9 g0 y' h! O; M    if(M<=0 && (a<=0&&b<=0&&c<=0&&d<=0)){cout<<total<<endl;alltotal[pos++]=total;return;}
    3 j$ T$ e1 w; W    for(int i=select[n-1];i<N;i++)" q8 U8 X+ y' U3 [: `+ [
        {, [7 {: i' f0 `4 S6 _6 \) ?
             for(int j=0;j<n;j++)if(select[j]==i)continue;2 ]& N, ^; K- {  |7 F
            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)), k# }2 i9 a0 b% w- _+ a" w, y
            {1 ^$ s# s4 P- ?
            int ta=a,tb=b,tc=c,td=d;
    & ]$ D. F7 n- s. u4 {        int* myselect=new int[n+1];   
    9 M$ ]* x$ h$ R/ x* \        for(int k=0;k<n;k++)myselect[k]=select[k];( f7 i) E$ k4 E
            myselect[n]=i;
    , F1 r' J' F0 _3 [        if(pcai.hun==1)ta--;else tb--;7 ~7 h& y* j: S/ }" K0 X
            if(pcai.la==1)tc--;else td--;
    % D2 D  P/ f. d: ]# C        fun(myselect,n+1,M-1,ta,tb,tc,td,total+pcai.price);4 H/ v, }! K( ?$ }! V
            delete[] myselect;
    5 c, S0 Q* K* B9 C& V        }
    0 g$ I6 P3 T; C+ T/ m% _    }2 Q0 a5 \8 k5 _8 D- F
    }
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    928171481        

    2

    主题

    6

    听众

    34

    积分

    升级  30.53%

    该用户从未签到

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2024-4-27 01:42 , Processed in 0.472818 second(s), 55 queries .

    回顶部