# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1224826 | TadijaSebez | Let's Win the Election (JOI22_ho_t3) | C++20 | 94 ms | 2408 KiB |
#include <bits/stdc++.h>
using namespace std;
#define ldb double
const int N=505;
const ldb inf=1e18;
const int bm1=1e9;
ldb dp[N][N];
int a[N],b[N],ord[N],mn[N];
int main(){
int n,k;
scanf("%i %i",&n,&k);
for(int i=1;i<=n;i++){
scanf("%i %i",&a[i],&b[i]);
ord[i]=i;
if(b[i]==-1)b[i]=bm1;
}
sort(ord+1,ord+1+n,[&](int i,int j){return make_pair(b[i],a[i])<make_pair(b[j],a[j]);});
multiset<int> tmp;
for(int i=n;i>k;i--){
tmp.insert(a[ord[i]]);
}
for(int i=k;i>=1;i--){
mn[i]=mn[i+1];
tmp.insert(a[ord[i]]);
mn[i]+=*tmp.begin();
tmp.erase(tmp.begin());
}
ldb ans=mn[1];
for(int take=0;take<=k;take++){
for(int i=0;i<=k;i++){
for(int j=0;j<=k;j++){
dp[i][j]=inf;
}
}
dp[0][0]=0;
for(int i=1;i<=k;i++){
for(int j=0;j<=min(i,take);j++){
dp[i][j]=dp[i-1][j]+(ldb)a[ord[i]]/(take+1);
if(j>0 && b[ord[i]]!=bm1){
dp[i][j]=min(dp[i][j],dp[i-1][j-1]+(ldb)b[ord[i]]/j);
}
}
if(i>=take){
ans=min(ans,dp[i][take]+(ldb)mn[i+1]/(take+1));
}
}
}
printf("%.12lf\n",ans);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |