这就是传说中的蘑菇题

题目的大意我就不说了,大家自己去google一下吧,有人说过了

就算锻炼了一下用vector,algorithm吧

算法很简单,先按照来的时间和报酬排序

然后在一个一个的处理,未处理的就加入到suspend里面,等到下一轮处理

有个地方比较特殊,就是为处理的任务,如果他的截止时间在F之前,那么会算惩罚,如果超出了,就不算了

刚开始这个地方没注意,所以贡献了几次WA

  1  #include  < iostream >
  2  #include  < algorithm >
  3  #include  < vector >
  4  using namespace std;
  5 
  6  struct rect
  7  {
  8  public :
  9      rect( int  a, int  b, int  c, int  d, int  e, int  f, int  g):m_a(a),m_b(b),m_c(c),m_d(d),m_e(e),m_f(f),m_g(g){}
 10       int  m_a,m_b,m_c,m_d,m_e,m_f,m_g;
 11  };
 12 
 13  vector < rect >  job,suspend;
 14  vector < rect > ::iterator it;
 15 
 16  bool compare(rect a,rect b)
 17  {
 18       if  (a.m_c < b.m_c)
 19           return   1 ;
 20       else   if  (a.m_c > b.m_c)
 21           return   0 ;
 22       else
 23      {
 24           if  (a.m_e > b.m_e)
 25               return   1 ;
 26           else
 27               return   0 ;
 28      }
 29  }
 30 
 31  int  main()
 32  {
 33       int  F;
 34       int  Case  =   1 ;
 35 
 36      cin  >>  F;
 37       while  (F != 0 )
 38      {
 39           int  M,N,L;
 40          cin  >>  M  >>  N  >>  L;
 41          
 42           // count the number of job
 43           int  totaljob  =   0 ;
 44          
 45           // initialize
 46          job.clear();
 47          suspend.clear();
 48 
 49           // input
 50           for  ( int  i  =   0 ; i  <  L; i ++ )
 51          {
 52 
 53               int  a,b,c,d,e,f,g;
 54 
 55              cin  >>  a  >>  b  >>  c  >>  d  >>  e  >>  f  >>  g;
 56 
 57               // Arraive before timeline
 58               if  (c < F)
 59              {
 60                  rect  * temp  =   new  rect(a,b,c,d,e,f,g);
 61                  job.push_back( * temp);
 62                  totaljob ++ ;
 63              }
 64          }
 65 
 66           // sort the jobs according to the arriving time
 67          sort(job.begin(),job.end(),compare);
 68 
 69          it  =  job.begin();
 70           long  totalvalue  =   0 ;
 71 
 72           for  ( int  time  =   0 ; time  <  F; time ++ )
 73          {
 74               int  mm  =  M;
 75               int  nn  =  N;
 76 
 77               while  (it  !=  job.end()  &&  time  >=  it -> m_c)
 78              {
 79                  suspend.push_back( * it);
 80                  it ++ ;
 81              }
 82 
 83              vector < rect > ::iterator temp;
 84              temp  =  suspend.begin();
 85              
 86               while  (temp != suspend.end())
 87              {
 88                   if  (mm >= temp -> m_a  &&  nn >= temp -> m_b)
 89                  {
 90                      mm -= temp -> m_a;
 91                      nn -= temp -> m_b;
 92                      totalvalue += temp -> m_e;
 93                       if  (time  +   1 <  temp -> m_d)
 94                          totalvalue += temp -> m_f * (temp -> m_d  -  time  -   1  );
 95                       else   if  (time  +   1   >  temp -> m_d)
 96                          totalvalue -= temp -> m_g * (time  +   1    -  temp -> m_d);                    
 97                      suspend.erase(temp);
 98                      temp  =  suspend.begin();
 99                  }
100                   else
101                      temp ++ ;
102 
103              }
104          }
105 
106          vector < rect > ::iterator temp;
107 
108           if  ( ! suspend.empty())
109          {
110               for  (temp  =  suspend.begin();temp != suspend.end();temp ++ )
111              {
112                   if  (temp -> m_d <= F)
113                      totalvalue -= (F  -  temp -> m_d) * temp -> m_g;
114              }
115          }
116           // for (it = job.begin(); it!=job.end(); it++)
117           //     cout << it->m_a << " " << it->m_b << " " << it->m_c << " " << it->m_d << " " << it->m_e
118           //     << " " << it->m_f << " " << it->m_g << endl;
119 
120 
121 
122      cout  <<   " Case  "   <<  Case ++   <<   " "   <<  totalvalue  <<  endl  <<  endl;
123      cin  >>  F;
124      }
125       return   0 ;
126  }