Submission #2695661
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
#define NDEBUG
#ifdef DEBUG
#include "../cout11.h"
#undef NDEBUG
#endif
#include <cassert>
typedef long long ll;
typedef long double Double;
typedef unsigned long long ull;
typedef pair<int,int> ii;
typedef pair<ll,ll> llll;
typedef pair<double,double> dd;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ii> vii;
typedef vector<vector<ii>> vvii;
typedef vector<ll> vll;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<long double> vD;
#define sz(a) int((a).size())
#define pb push_back
#define FOR(var,from,to) for(int var=(from);var<=(to);++var)
#define rep(var,n) for(int var=0;var<(n);++var)
#define rep1(var,n) for(int var=1;var<=(n);++var)
#define repC2(vari,varj,n) for(int vari=0;vari<(n)-1;++vari)for(int varj=vari+1;varj<(n);++varj)
#define ALL(c) (c).begin(),(c).end()
#define RALL(c) (c).rbegin(),(c).rend()
#define tr(i,c) for(auto i=(c).begin(); i!=(c).end(); ++i)
#define found(s,e) ((s).find(e)!=(s).end())
#define mset(arr,val) memset(arr,val,sizeof(arr))
#define mid(x,y) ((x)+((y)-(x))/2)
#define IN(x,a,b) ((a)<=(x)&&(x)<=(b))
ll gcd(ll a, ll b) { while(a) swap(a, b%=a); return b; }
const ll MOD=1000000007LL;
ll ADD(ll x, ll y) { return (x+y) % MOD; }
ll SUB(ll x, ll y) { return (x-y+MOD) % MOD; }
ll MUL(ll x, ll y) { return x*y % MOD; }
ll POW(ll x, ll e) { ll v=1; for(; e; x=MUL(x,x), e>>=1) if (e&1) v = MUL(v,x); return v; }
ll DIV(ll x, ll y) { /*assert(y%MOD!=0);*/ return MUL(x, POW(y, MOD-2)); }
// ll comb(ll n, ll k) { ll v=1; for(ll i=1; i<=k; i++) v = DIV(MUL(v, n-i+1),i); return v; }
//
ll solve(int N,int W,vi& w,vi& v){
int w0 = w[0];
// vi dw(N); rep(i,N) dw[i] = w[i] - w0;
vvi dw(4, vi());
rep(i,N){
dw[w[i] - w0].pb(v[i]);
}
vi dwn(4);
rep(i,4){
sort(ALL(dw[i]));
dw[i].pb(0);
reverse(ALL(dw[i]));
dwn[i] = dw[i].size();
// accum
rep(j,dwn[i]-1) {
dw[i][j+1] += dw[i][j];
}
#ifdef DEBUG
cerr << i << " " << dwn[i] << " " << dw[i] << endl;
#endif
}
int best = 0;
for (int a=0; a<dwn[0]; ++a)
for (int b=0; b<dwn[1]; ++b)
for (int c=0; c<dwn[2]; ++c)
for (int d=0; d<dwn[3]; ++d) {
int vsum = dw[0][a] + dw[1][b] + dw[2][c] + dw[3][d];
ll wsum = (a*0 + b*1 + c*2 + d*3) + (ll)w0*(a+b+c+d);
if (wsum <= W) best = max(best, vsum);
}
return best;
}
int main() {
int N, W; cin >> N >> W;
vi w(N), v(N);
rep(i,N) cin >> w[i] >> v[i];
cout << solve(N,W,w,v) << endl;
return 0;
}
Submission Info
Submission Time |
|
Task |
D - Simple Knapsack |
User |
naoya_t |
Language |
C++14 (GCC 5.4.1) |
Score |
400 |
Code Size |
2706 Byte |
Status |
AC |
Exec Time |
2 ms |
Memory |
256 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
400 / 400 |
Status |
|
|
Set Name |
Test Cases |
Sample |
example0, example1, example2, example3 |
All |
antigreedy0, antigreedy1, antigreedy2, example0, example1, example2, example3, quarter0, quarter1, quarter2, rand0, rand1, rand2, smallw0, smallw1, smallw2 |
Case Name |
Status |
Exec Time |
Memory |
antigreedy0 |
AC |
1 ms |
256 KB |
antigreedy1 |
AC |
1 ms |
256 KB |
antigreedy2 |
AC |
1 ms |
256 KB |
example0 |
AC |
1 ms |
256 KB |
example1 |
AC |
1 ms |
256 KB |
example2 |
AC |
1 ms |
256 KB |
example3 |
AC |
1 ms |
256 KB |
quarter0 |
AC |
2 ms |
256 KB |
quarter1 |
AC |
2 ms |
256 KB |
quarter2 |
AC |
2 ms |
256 KB |
rand0 |
AC |
1 ms |
256 KB |
rand1 |
AC |
1 ms |
256 KB |
rand2 |
AC |
1 ms |
256 KB |
smallw0 |
AC |
2 ms |
256 KB |
smallw1 |
AC |
2 ms |
256 KB |
smallw2 |
AC |
2 ms |
256 KB |