제출 #1327374

#제출 시각아이디문제언어결과실행 시간메모리
1327374jumpJelly Flavours (IOI20_jelly)C++20
0 / 100
27 ms524 KiB
#include<bits/stdc++.h>

int dp[10010];
//least x spent with y(i) spent
int topvalue[10010];
//least y spent getting all x's i jelly
int find_maximum_unique(int x, int y, std::vector<int> a, std::vector<int> b) {
	std::vector<std::pair<int,int>> comb;
	std::vector<std::pair<int,int>> comb2;
	for(int i=0;i<a.size();i++){
		comb.push_back({a[i],b[i]});
	}
	for(int i=0;i<2020;i++){
		topvalue[i]=1e9;
	}
	for(int i=0;i<a.size();i++){
		comb2.push_back({comb[i].second,i});
	}
	std::sort(comb.begin(),comb.end());
	std::sort(comb2.begin(),comb2.end());
	int jelly=0;
	for(auto [ca,cb]:comb){
		for(int i=y;i>=0;i--){
			if(dp[i]>=x)continue;
			if(i>=cb){ 
				//std::cout << cb << '*';
				dp[i]=std::min(dp[i]+ca,dp[i-cb]);
			}else dp[i]=dp[i]+ca;
			//std::cout << dp[i] << ' ';
			if(dp[i]>=x){
				topvalue[jelly]=std::min(topvalue[jelly],i);
			}
		}//std::cout << '\n';
		bool pos=false;
		for(int i=0;i<=y;i++){
			if(dp[i]<=x)pos=true;
		}
		if(!pos)break;
		jelly+=1;
	}
	int best=jelly;
	for(int i=0;i<=2000;i++){
		if(topvalue[i]>y)break;
		int yleft = y-topvalue[i];
		int currentjelly = i;
		for(int j=0;j<comb2.size();j++){
			if(comb2[j].second<i)continue;
			if(comb2[j].first>yleft)break;
			yleft-=comb2[j].first;
			currentjelly+=1;
		}
		best=std::max(best,currentjelly);
	}
	return best;
}
#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...