Submission #1182686

#TimeUsernameProblemLanguageResultExecution timeMemory
1182686PieArmyLet's Win the Election (JOI22_ho_t3)C++20
100 / 100
158 ms2416 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
using namespace std;

int n,k;
double a[501],b[501];
double dp[501][501];
int per[501];

double cal(double m){
	double x=k-m;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=x;j++){
			dp[i][j]=1e11;
		}
	}
	dp[0][0]=0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=x;j++){
			if(j>i)continue;
			if(j){
				dp[i][j]=min(dp[i][j],dp[i-1][j-1]+(a[per[i]]/double(m+1)));
			}
			if(i!=j){
				if(b[per[i]]>0&&i-j<=m)dp[i][j]=min(dp[i][j],dp[i-1][j]+(b[per[i]]/double(i-j)));
				else if(i-j>m)dp[i][j]=min(dp[i][j],dp[i-1][j]);
			}
		}
	}
	return dp[n][int(x)];
}

int main(){
	ios_base::sync_with_stdio(false);cin.tie(NULL);
	cin>>n>>k;
	int m=0;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
		if(b[i]!=-1)m++;
	}
	iota(per+1,per+n+1,1);
	sort(per+1,per+n+1,[&](const int &x,const int &y){
		if(b[x]==-1)return false;
		if(b[y]==-1)return true;
		return b[x]<b[y];
	});
	double ans=1e11;
	for(int i=0;i<=min(m,k);i++){
		ans=min(ans,cal(i));
	}
	cout<<ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...