POJ 1010

ExpandedBlockStart.gif code
  1  #include  < iostream >
  2  using   namespace  std;
  3 
  4  int  stamps[ 500 ];
  5  int  s[ 4 ]; 
  6  int  n;  // number of stamp types
  7  int  m;  // number of customer request
  8  int  k;  // number of stamps sold
  9  int  t;  // types of stamps sold
 10  int  maxValue;  // highest single stamp value
 11  int  curK;  // numbers of stamps sold of current best solution
 12  int  curT;  // types of stamps sold of current best solution
 13  int  curM;  // highest single stamp value of current best solution
 14  int  curS[ 4 ];  // current best solution
 15  bool  curTie;  // if there is a tie 
 16 
 17  bool  LessThan5( int  value)
 18  {
 19       int  count  =   0 ;
 20       for ( int  i = 0 ; i < n; i ++ )
 21      {
 22           if (stamps[i]  ==  value)
 23          {
 24              count ++ ;
 25          }
 26      }
 27       return  count  <   5 ;
 28  }
 29 
 30  void  Test()
 31  {
 32       for (s[ 0 ] = 0 ; s[ 0 ] < n; s[ 0 ] ++ )
 33      {
 34           for (s[ 1 ] = s[ 0 ]; s[ 1 ] < n; s[ 1 ] ++ )
 35          {
 36               for (s[ 2 ] = s[ 1 ]; s[ 2 ] < n; s[ 2 ] ++ )
 37              {
 38                   for (s[ 3 ] = s[ 2 ]; s[ 3 ] < n; s[ 3 ] ++ )
 39                  {
 40                       if (stamps[s[ 0 ]] + stamps[s[ 1 ]] + stamps[s[ 2 ]] + stamps[s[ 3 ]]  !=  m)
 41                      {
 42                           continue ;
 43                      }
 44 
 45                      k  =   0 ;
 46                      t  =   0 ;
 47                      maxValue  =   0 ;
 48                       if (stamps[s[ 0 ]])
 49                      {
 50                          k ++ ;
 51                          t ++ ;
 52                           if (stamps[s[ 0 ]]  >  maxValue)
 53                          {
 54                              maxValue  =  stamps[s[ 0 ]];
 55                          }
 56                      }
 57 
 58                       if (stamps[s[ 1 ]])
 59                      {
 60                          k ++ ;
 61                           if (s[ 1 >  s[ 0 ])
 62                          {
 63                              t ++ ;
 64                          }
 65                           if (stamps[s[ 1 ]]  >  maxValue)
 66                          {
 67                              maxValue  =  stamps[s[ 1 ]];
 68                          }
 69                      }
 70 
 71                       if (stamps[s[ 2 ]])
 72                      {
 73                          k ++ ;
 74                           if (s[ 2 >  s[ 1 ])
 75                          {
 76                              t ++ ;
 77                          }
 78                           if (stamps[s[ 2 ]]  >  maxValue)
 79                          {
 80                              maxValue  =  stamps[s[ 2 ]];
 81                          }
 82                      }
 83 
 84                       if (stamps[s[ 3 ]])
 85                      {
 86                          k ++ ;
 87                           if (s[ 3 >  s[ 2 ])
 88                          {
 89                              t ++ ;
 90                          }
 91                           if (stamps[s[ 3 ]]  >  maxValue)
 92                          {
 93                              maxValue  =  stamps[s[ 3 ]];
 94                          }
 95                      }
 96 
 97                       if (t  <  curT)
 98                      {
 99                           continue ;
100                      }
101 
102                       if (t  >  curT)
103                      {
104                          curT  =  t;
105                          curK  =  k;
106                          curM  =  maxValue;
107                          curS[ 0 =  s[ 0 ];
108                          curS[ 1 =  s[ 1 ];
109                          curS[ 2 =  s[ 2 ];
110                          curS[ 3 =  s[ 3 ];
111                          curTie  =   false ;
112                           continue ;
113                      }
114 
115                       if (k  >  curK)
116                      {
117                           continue ;
118                      }
119 
120                       if (k  <  curK)
121                      {
122                          curT  =  t;
123                          curK  =  k;
124                          curM  =  maxValue;
125                          curS[ 0 =  s[ 0 ];
126                          curS[ 1 =  s[ 1 ];
127                          curS[ 2 =  s[ 2 ];
128                          curS[ 3 =  s[ 3 ];
129                          curTie  =   false ;
130                           continue ;
131                      }
132 
133                       if (maxValue  <  curM)
134                      {
135                           continue ;
136                      }
137 
138                       if (maxValue  >  curM)
139                      {
140                          curT  =  t;
141                          curK  =  k;
142                          curM  =  maxValue;
143                          curS[ 0 =  s[ 0 ];
144                          curS[ 1 =  s[ 1 ];
145                          curS[ 2 =  s[ 2 ];
146                          curS[ 3 =  s[ 3 ];
147                          curTie  =   false ;
148                           continue ;
149                      }
150 
151                      curTie  =   true ;
152                  }
153              }
154          }
155      }
156 
157       if (curT  ==   - 1 )
158      {
159          cout  <<  m  <<   "  ---- none "   <<  endl;
160           return ;
161      }
162 
163      cout  <<  m  <<   "  ( "   <<  curT  <<   " ): " ;
164       if (curTie)
165      {
166          cout  <<   "  tie "   <<  endl;
167           return ;
168      }
169 
170       for  ( int  i = 0 ; i < 4 ; i ++ )
171      {
172           if  (stamps[curS[i]]  >   0  ) 
173          {
174              cout  <<   '   ' <<  stamps[curS[i]];
175          }
176      }
177 
178      cout << endl;
179  }
180 
181  int  main()
182  {
183       int  tag;
184       while (cin  >>  tag)
185      {
186           // very important: to make stamps[0] = 0
187          n  =   1 ;
188          stamps[n ++ =  tag;
189           while (cin  >>  tag  &&  tag)
190          {
191               if (LessThan5(tag))
192              {
193                  stamps[n ++ =  tag;
194              }
195          }
196 
197           while (cin  >>  m  &&  m)
198          {
199              curK  =   - 1 ;
200              curT  =   - 1 ;
201              curM  =   - 1 ;
202              curTie  =   false ;
203              Test();
204          }
205      }
206 
207       return   0 ;
208  }

 

转载于:https://www.cnblogs.com/zhtf2014/archive/2010/08/17/1801940.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值