这就是传说中的蘑菇题
题目的大意我就不说了,大家自己去google一下吧,有人说过了
就算锻炼了一下用vector,algorithm吧
算法很简单,先按照来的时间和报酬排序
然后在一个一个的处理,未处理的就加入到suspend里面,等到下一轮处理
有个地方比较特殊,就是为处理的任务,如果他的截止时间在F之前,那么会算惩罚,如果超出了,就不算了
刚开始这个地方没注意,所以贡献了几次WA
题目的大意我就不说了,大家自己去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 }
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 }