Submission #1304744
Source Code Expand
#include <cstdio>
#include <vector>
struct state {
int aw;
int av;
state(int aw=0, int av=0): aw(aw), av(av) {}
};
int n, w, c;
std::vector<state> is[50];
std::vector<state> tmp;
std::vector<state> dp[51][2];
int maxv;
double maxr;
void merge(const std::vector<state> &s, const std::vector<state> &t, std::vector<state> &u){
auto i = s.cbegin();
auto j = t.cbegin();
for(; i != s.cend() && j != t.cend();){
if(i->aw <= j->aw && i->av >= j->av) ++j;
else if(i->aw >= j->aw && i->av <= j->av) ++i;
else if(i->aw < j->aw) u.push_back(*i++);
else u.push_back(*j++);
}
while(i != s.cend()) u.push_back(*i++);
while(j != t.cend()) u.push_back(*j++);
}
void mergei(const std::vector<state> &s, const state &k, std::vector<state> &u){
auto i = s.cbegin();
auto j = s.cbegin();
for(; i != s.cend() && j != s.cend() && j->aw + k.aw <= w;){
if(i->aw <= j->aw + k.aw && i->av >= j->av + k.av) ++j;
else if(i->aw >= j->aw + k.aw && i->av <= j->av + k.av) ++i;
else if(i->aw < j->aw + k.aw) u.push_back(*i++);
else {u.emplace_back(state(j->aw + k.aw, j->av + k.av)); ++j;}
}
while(i != s.cend()) u.push_back(*i++);
while(j != s.cend() && j->aw + k.aw <= w){
u.emplace_back(state(j->aw + k.aw, j->av + k.av));
++j;
}
}
void shrink(const std::vector<state> &s, std::vector<state> &t){
// printf("B %d\n", s.size());
for(auto x: s){
if(x.av + (w-x.aw)*maxr + 0.5 >= maxv) t.push_back(x);
// if(1) t.push_back(x);
}
// printf("A %d\n", t.size());
}
int main(){
scanf("%d%d%d", &n, &w, &c);
for(int i=0;i<n;i++){
int ww, vv, cc;
scanf("%d%d%d",&ww,&vv,&cc);
if(ww <= w){
is[cc-1].emplace_back(state(ww, vv));
maxr = std::max(maxr, (double) vv / ww);
}
}
tmp.reserve(500);
for(int i=0;i<=50;i++){
dp[i][0].reserve(500);
dp[i][1].reserve(500);
dp[i][0].emplace_back(state(0, 0));
dp[i][1].emplace_back(state(0, 0));
}
for(int i=0;i<50;i++){
if(is[i].empty()) continue;
for(int k = 1; k <= c; k++){
merge(dp[k][1], dp[k][0], tmp);
dp[k][0].resize(0);
shrink(tmp, dp[k][0]);
tmp.resize(0);
dp[k][1].resize(0);
mergei(dp[k-1][0], is[i][0], dp[k][1]);
maxv = std::max(maxv, dp[k][1].back().av);
}
for(auto j = is[i].cbegin()+1; j != is[i].cend(); ++j){
for(int k = 1; k <= c; k++){
mergei(dp[k][1], *j, tmp);
maxv = std::max(maxv, tmp.back().av);
dp[k][1].resize(0);
shrink(tmp, dp[k][1]);
tmp.resize(0);
}
}
}
printf("%d\n", maxv);
return 0;
}
Submission Info
Submission Time |
|
Task |
H - ナップザック |
User |
ryuhei |
Language |
C++14 (GCC 5.4.1) |
Score |
5 |
Code Size |
2721 Byte |
Status |
AC |
Exec Time |
74 ms |
Memory |
3712 KB |
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:62:30: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d", &n, &w, &c);
^
./Main.cpp:65:32: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d",&ww,&vv,&cc);
^
Judge Result
Set Name |
All |
Score / Max Score |
5 / 5 |
Status |
|
Set Name |
Test Cases |
All |
00, 01, 02, 03, 04, 05, 08, 09, 10, 90, 91 |
Case Name |
Status |
Exec Time |
Memory |
00 |
AC |
6 ms |
896 KB |
01 |
AC |
11 ms |
1152 KB |
02 |
AC |
11 ms |
1280 KB |
03 |
AC |
7 ms |
896 KB |
04 |
AC |
1 ms |
640 KB |
05 |
AC |
74 ms |
3712 KB |
08 |
AC |
1 ms |
640 KB |
09 |
AC |
2 ms |
640 KB |
10 |
AC |
2 ms |
640 KB |
90 |
AC |
1 ms |
640 KB |
91 |
AC |
1 ms |
640 KB |