제출 #1169160

#제출 시각아이디문제언어결과실행 시간메모리
11691604QT0RJelly Flavours (IOI20_jelly)C++20
68 / 100
2095 ms50248 KiB
#include "jelly.h"
#include <bits/stdc++.h>
using namespace std;

int find_maximum_unique(int x, int y, vector<int> a, vector<int> b){
	int n = a.size();
	int zeros=0;
	int mx=0;
	bool podz4=true,podz5=true;
	for (int i = 0; i<n; i++){
		if (a[i]!=b[i])podz5=false;
		if (b[i]!=b[0])podz4=false;
	}
	if (podz4){
		if (b[0]==0)return n;
		sort(a.begin(),a.end());
		while(y>=b.back() && a.size()){
			y-=b.back();
			b.pop_back();
			a.pop_back();
			zeros++;
			n--;
		}
		vector<int> dp(x+1);
		for (int i = 0; i<n; i++){
			if (!a[i]){
				zeros++;
				continue;
			}
			for (int j = x; j>=a[i]; j--){
				dp[j]=max(dp[j],dp[j-a[i]]+1);
				mx=max(mx,dp[j]);
			}
		}
		return mx+zeros;
	}
	if (podz5){
		int oo=1e9+1;
		vector<vector<int>> dp(2001,vector<int>(2001,oo));
		for (int i = 0; i<n; i++)dp[i][0]=0;
		for (int i = 1; i<=n; i++){
			for (int j = 1; j<=i; j++){
				dp[i][j]=min(dp[i-1][j],dp[i-1][j-1]+a[i-1]);
			}
		}
		int num=n,wyn=0,sum=x+y+1;
		for (int i = n; i>=0; i--){
			if (dp[n][i]<=x+y){
				wyn=i;
				sum=dp[n][i];
				break;
			}
		}
		mx=wyn;
		vector<int> to_check;
		while(wyn && num){
			if (dp[num][wyn]==dp[num-1][wyn-1]+a[num-1]){
				to_check.push_back(a[num-1]);
				wyn--;
			}
			num--;
		}
		bitset<20001> bs;
		bs[0]=1;
		for (auto u : to_check)bs|=(bs<<u);
		for (int i = x; i>=max(0,sum-y); i--){
			if (bs[i])return mx;
		}
		return max(0,mx-1);
	}
	vector<vector<int>> dp(x+1,vector<int>(y+1));
	for (int i = 0; i<n; i++){
		if (!a[i] || !b[i]){
			zeros++;
			continue;
		}
		for (int j = x; j>=0; j--){
			for (int u = y; u>=0; u--){
				if (j>=a[i])dp[j][u]=max(dp[j][u],dp[j-a[i]][u]+1);
				if (u>=b[i])dp[j][u]=max(dp[j][u],dp[j][u-b[i]]+1);
				mx=max(mx,dp[j][u]);
			}
		}
	}
	return mx+zeros;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...