#include <bits/stdc++.h>
#define problem "test"
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define ALL(v) (v).begin(),(v).end()
#define UNIQUE(v) (v).resize(unique(ALL(v)) - (v).begin())
#define BIT(x,i) (((x) >> (i)) & 1)
#define MASK(i) (1LL << (i))
using namespace std;
const int N = 2000;
template<class X,class Y>
bool maximize(X &x,Y y){
if (x < y){
x = y; return true;
}
return false;
}
template<class X,class Y>
bool minimize(X &x,Y y){
if (x > y){
x = y; return true;
}
return false;
}
struct State{
ll c,f,v;
State (ll _c = 0,ll _f = 0,ll _v = 0){
c = _c, f = _f, v = _v;
}
void input(){
cin>>c>>f>>v;
}
bool operator < (const State &other) const{
return f > other.f;
}
};
int n,m;
State cpt[N + 5],person[N + 5];
ll maxCore,maxF;
namespace subtask1{
const int nMax = 15;
const int sMax = 750;
ll dp[2][N + 5][sMax + 5],oo;
void process(){
int sumMax = 0;
for (int i=1;i<= n;i++ )
sumMax += cpt[i].c;
memset(dp,-0x3f,sizeof(dp));
oo = dp[0][0][0];
dp[0][0][0] = 0;
for (int i=0;i<= n;i++ ){
memset(dp[(i + 1) & 1],-0x3f,sizeof(dp[(i + 1) & 1]));
for (int j=0;j<= m;j++ )
for (int cnt=0;cnt<= sumMax;cnt++ )
if (dp[i & 1][j][cnt] != oo){
if (j < m && person[j + 1].f <= cpt[i].f && person[j + 1].c <= cnt)
maximize(dp[i & 1][j + 1][cnt - person[j + 1].c],dp[i & 1][j][cnt] + person[j + 1].v);
if (i < n && cnt + cpt[i + 1].c <= sumMax)
maximize(dp[(i + 1) & 1][j][cnt + cpt[i + 1].c],dp[i & 1][j][cnt] - cpt[i + 1].v);
maximize(dp[(i + 1) & 1][j][cnt],dp[i & 1][j][cnt]);
maximize(dp[i & 1][j + 1][cnt],dp[i & 1][j][cnt]);
maximize(dp[(i + 1) & 1][j + 1][cnt],dp[i & 1][j][cnt]);
}
}
ll res = oo;
for (int cnt=0;cnt<= sumMax;cnt++ )
maximize(res,dp[n & 1][m][cnt]);
cout<<res;
}
};
namespace subtask2{
const int nMax = 15;
const int sMax = 750;
ll dp[2][nMax + 5][sMax + 5],oo;
void process(){
int sumMax = 0;
for (int i=1;i<= n;i++ )
sumMax += person[i].c;
memset(dp,-0x3f,sizeof(dp));
oo = dp[0][0][0];
dp[0][0][0] = 0;
for (int i=0;i<= n;i++ ){
memset(dp[(i + 1) & 1],-0x3f,sizeof(dp[(i + 1) & 1]));
for (int j=0;j<= m;j++ )
for (int cnt=0;cnt<= sumMax;cnt++ )
if (dp[i & 1][j][cnt] != oo){
if (j < m && person[j + 1].f <= cpt[i].f && person[j + 1].c <= cnt)
maximize(dp[i & 1][j + 1][cnt - person[j + 1].c],dp[i & 1][j][cnt] + person[j + 1].v);
if (i < n){
int newCnt = (cnt + cpt[i + 1].c >= sumMax ? sumMax : cnt + cpt[i + 1].c);
maximize(dp[(i + 1) & 1][j][newCnt],dp[i & 1][j][cnt] - cpt[i + 1].v);
}
maximize(dp[(i + 1) & 1][j][cnt],dp[i & 1][j][cnt]);
maximize(dp[i & 1][j + 1][cnt],dp[i & 1][j][cnt]);
maximize(dp[(i + 1) & 1][j + 1][cnt],dp[i & 1][j][cnt]);
}
}
ll res = oo;
for (int cnt=0;cnt<= sumMax;cnt++ )
maximize(res,dp[n & 1][m][cnt]);
cout<<res;
}
};
namespace subtask3{
const int nMax = 2000;
ll dp[nMax + 5][nMax + 5],oo;
void process(){
for (int i=1;i<= n;i++ )
for (int j=1;j<= m;j++ ){
dp[i][j] = max({dp[i][j - 1],dp[i - 1][j],dp[i - 1][j - 1]});
if (cpt[i].f >= person[j].f)
dp[i][j] = max(dp[i][j],dp[i - 1][j - 1] + person[j].v - cpt[i].v);
}
cout<<dp[n][m];
}
}
namespace subtask4{
const int sumMax = 1e5;
ll maxValue[sumMax + 5],minCost[sumMax + 5],oo;
void process(){
int sumCpt = 0;
for (int i=1;i<= n;i++ )
sumCpt += cpt[i].c;
memset(minCost,0x3f,sizeof(minCost));
minCost[0] = 0;
for (int i=1;i<= n;i++ )
for (int cnt=sumCpt;cnt>= cpt[i].c;cnt-- )
minimize(minCost[cnt],minCost[cnt - cpt[i].c] + cpt[i].v);
int sumPer = 0;
for (int i=1;i<= m;i++ )
sumPer += person[i].c;
memset(maxValue,-0x3f,sizeof(maxValue));
oo = maxValue[0];
maxValue[0] = 0;
for (int i=1;i<= m;i++ )
for (int cnt=sumPer;cnt>= person[i].c;cnt-- )
maximize(maxValue[cnt],maxValue[cnt - person[i].c] + person[i].v);
for (int i=sumCpt;i>= 0;i-- )
minimize(minCost[i],minCost[i + 1]);
ll res = 0;
for (int i=0;i<= min(sumCpt,sumPer);i++ )
if (maxValue[i] != oo)
res = max(res,maxValue[i] - minCost[i]);
cout<<res;
}
};
namespace subtask6{
const int nMax = 2000;
const int cMax = 100;
ll dp[2][nMax + 5][cMax + 5],oo;
void process(){
memset(dp,-0x3f,sizeof(dp));
oo = dp[0][0][0];
dp[0][0][0] = 0;
for (int i=0;i<= n;i++ ){
memset(dp[(i + 1) & 1],-0x3f,sizeof(dp[(i + 1) & 1]));
for (int j=0;j<= m;j++ )
for (int cnt=0;cnt<= 100;cnt++ )
if (dp[i & 1][j][cnt] != oo){
if (j < m && person[j + 1].f <= cpt[i].f && person[j + 1].c <= cnt)
maximize(dp[i & 1][j + 1][cnt - person[j + 1].c],dp[i & 1][j][cnt] + person[j + 1].v);
if (i < n && cnt + cpt[i + 1].c <= cMax){
int newCnt = (cnt + cpt[i + 1].c);
maximize(dp[(i + 1) & 1][j][newCnt],dp[i & 1][j][cnt] - cpt[i + 1].v);
}
maximize(dp[(i + 1) & 1][j][cnt],dp[i & 1][j][cnt]);
maximize(dp[i & 1][j + 1][cnt],dp[i & 1][j][cnt]);
// maximize(dp[(i + 1) & 1][j + 1][cnt],dp[i & 1][j][cnt]);
}
}
ll res = 0;
for (int cnt=0;cnt<= 100;cnt++ )
maximize(res,dp[n & 1][m][cnt]);
cout<<res;
}
};
int main(){
ios_base :: sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin>>n;
for (int i=1;i<= n;i++ ){
cpt[i].input();
maxCore = max(maxCore,cpt[i].c);
maxF = max(maxF,cpt[i].f);
}
cin>>m;
for (int i=1;i<= m;i++ ){
person[i].input();
maxCore = max(maxCore,person[i].c);
maxF = max(maxF,person[i].f);
}
sort(cpt + 1,cpt + n + 1);
sort(person + 1,person + m + 1);
subtask6 :: process();
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
4696 KB |
Output is correct |
2 |
Correct |
1 ms |
4700 KB |
Output is correct |
3 |
Correct |
1 ms |
4700 KB |
Output is correct |
4 |
Correct |
1 ms |
4700 KB |
Output is correct |
5 |
Correct |
11 ms |
4700 KB |
Output is correct |
6 |
Correct |
6 ms |
4696 KB |
Output is correct |
7 |
Correct |
9 ms |
4700 KB |
Output is correct |
8 |
Correct |
10 ms |
4836 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
4700 KB |
Output is correct |
2 |
Correct |
1 ms |
4700 KB |
Output is correct |
3 |
Correct |
4 ms |
4700 KB |
Output is correct |
4 |
Correct |
4 ms |
4700 KB |
Output is correct |
5 |
Correct |
29 ms |
4700 KB |
Output is correct |
6 |
Correct |
32 ms |
4948 KB |
Output is correct |
7 |
Correct |
61 ms |
4700 KB |
Output is correct |
8 |
Correct |
64 ms |
4700 KB |
Output is correct |
9 |
Correct |
61 ms |
4700 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
4696 KB |
Output is correct |
2 |
Correct |
1 ms |
4700 KB |
Output is correct |
3 |
Correct |
4 ms |
4832 KB |
Output is correct |
4 |
Correct |
4 ms |
4700 KB |
Output is correct |
5 |
Correct |
18 ms |
4836 KB |
Output is correct |
6 |
Correct |
18 ms |
4700 KB |
Output is correct |
7 |
Correct |
26 ms |
4700 KB |
Output is correct |
8 |
Correct |
26 ms |
4700 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
4700 KB |
Output is correct |
2 |
Correct |
1 ms |
4700 KB |
Output is correct |
3 |
Correct |
45 ms |
4812 KB |
Output is correct |
4 |
Correct |
10 ms |
4700 KB |
Output is correct |
5 |
Correct |
1402 ms |
4816 KB |
Output is correct |
6 |
Correct |
1348 ms |
4944 KB |
Output is correct |
7 |
Correct |
1433 ms |
4812 KB |
Output is correct |
8 |
Correct |
1399 ms |
4820 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
4700 KB |
Output is correct |
2 |
Correct |
3 ms |
4700 KB |
Output is correct |
3 |
Correct |
69 ms |
4808 KB |
Output is correct |
4 |
Correct |
408 ms |
4700 KB |
Output is correct |
5 |
Correct |
1381 ms |
4812 KB |
Output is correct |
6 |
Correct |
1361 ms |
4812 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
4696 KB |
Output is correct |
2 |
Correct |
1 ms |
4700 KB |
Output is correct |
3 |
Correct |
1 ms |
4700 KB |
Output is correct |
4 |
Correct |
1 ms |
4700 KB |
Output is correct |
5 |
Correct |
11 ms |
4700 KB |
Output is correct |
6 |
Correct |
6 ms |
4696 KB |
Output is correct |
7 |
Correct |
9 ms |
4700 KB |
Output is correct |
8 |
Correct |
10 ms |
4836 KB |
Output is correct |
9 |
Correct |
1 ms |
4700 KB |
Output is correct |
10 |
Correct |
1 ms |
4700 KB |
Output is correct |
11 |
Correct |
4 ms |
4700 KB |
Output is correct |
12 |
Correct |
4 ms |
4700 KB |
Output is correct |
13 |
Correct |
29 ms |
4700 KB |
Output is correct |
14 |
Correct |
32 ms |
4948 KB |
Output is correct |
15 |
Correct |
61 ms |
4700 KB |
Output is correct |
16 |
Correct |
64 ms |
4700 KB |
Output is correct |
17 |
Correct |
61 ms |
4700 KB |
Output is correct |
18 |
Correct |
1 ms |
4696 KB |
Output is correct |
19 |
Correct |
1 ms |
4700 KB |
Output is correct |
20 |
Correct |
4 ms |
4832 KB |
Output is correct |
21 |
Correct |
4 ms |
4700 KB |
Output is correct |
22 |
Correct |
18 ms |
4836 KB |
Output is correct |
23 |
Correct |
18 ms |
4700 KB |
Output is correct |
24 |
Correct |
26 ms |
4700 KB |
Output is correct |
25 |
Correct |
26 ms |
4700 KB |
Output is correct |
26 |
Correct |
1 ms |
4700 KB |
Output is correct |
27 |
Correct |
1 ms |
4700 KB |
Output is correct |
28 |
Correct |
45 ms |
4812 KB |
Output is correct |
29 |
Correct |
10 ms |
4700 KB |
Output is correct |
30 |
Correct |
1402 ms |
4816 KB |
Output is correct |
31 |
Correct |
1348 ms |
4944 KB |
Output is correct |
32 |
Correct |
1433 ms |
4812 KB |
Output is correct |
33 |
Correct |
1399 ms |
4820 KB |
Output is correct |
34 |
Correct |
1 ms |
4700 KB |
Output is correct |
35 |
Correct |
3 ms |
4700 KB |
Output is correct |
36 |
Correct |
69 ms |
4808 KB |
Output is correct |
37 |
Correct |
408 ms |
4700 KB |
Output is correct |
38 |
Correct |
1381 ms |
4812 KB |
Output is correct |
39 |
Correct |
1361 ms |
4812 KB |
Output is correct |
40 |
Correct |
108 ms |
4700 KB |
Output is correct |
41 |
Correct |
321 ms |
4808 KB |
Output is correct |
42 |
Correct |
770 ms |
4828 KB |
Output is correct |
43 |
Correct |
595 ms |
4700 KB |
Output is correct |
44 |
Correct |
609 ms |
4812 KB |
Output is correct |
45 |
Correct |
659 ms |
4812 KB |
Output is correct |
46 |
Correct |
345 ms |
4812 KB |
Output is correct |
47 |
Correct |
732 ms |
4808 KB |
Output is correct |
48 |
Correct |
738 ms |
4948 KB |
Output is correct |