제출 #1237882

#제출 시각아이디문제언어결과실행 시간메모리
1237882warrennLet's Win the Election (JOI22_ho_t3)C++20
100 / 100
541 ms6308 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define double long double

bool cmp(pair<int,int>a,pair<int,int>b){
    if(a.second==-1 && b.second==-1){
        return a.first<b.first;
    }
    else if(a.second==-1)return false;
    else if(b.second==-1)return true;
    if(a.second!=b.second)return a.second<b.second;
    return a.first<b.first;
}

signed main(){
    int n,k;
    cin>>n>>k;
    pair<int,int>isi[n+1];
    for(int q=1;q<=n;q++){
        cin>>isi[q].first>>isi[q].second;
    }
    sort(isi+1,isi+n+1,cmp);
  
    int suff[n+2][k+1];
    for(int q=1;q<=k;q++){
        suff[n+1][q]=1e18;
    }
    suff[n+1][0]=0;

    for(int q=n;q>=1;q--){
        for(int w=0;w<=k;w++){
            suff[q][w]=1e18;
            // ambil
            if(w!=0){
                suff[q][w]=min(suff[q][w],suff[q+1][w-1]+isi[q].first);
            }
            // ga
            suff[q][w]=min(suff[q][w],suff[q+1][w]);
            
          //  cout<<suff[q][w]<<" ";
            
        }
       // cout<<endl;
    }

    double ans=1e18;

    double dp[k+1][k+1];
    
    for(int buff=0;buff<=k;buff++){
        dp[0][0]=0;
        if(buff==0){
            double sisa=suff[1][k]/(double)(buff+1);
            ans=min(ans,sisa);
        }

        for(int q=1;q<=k;q++){
            dp[0][q]=1e18;
        }
        for(int q=1;q<=k;q++){
            for(int w=0;w<=buff;w++){
                dp[q][w]=1e18;
                if(q<w)continue;
                // ambil buff
                if(w!=0 && isi[q].second!=-1){
                    double waktu=(double)isi[q].second/(double)(w);
                    dp[q][w]=min(dp[q][w],dp[q-1][w-1]+waktu);
                }
                // ga ambil b
                double waktu=(double)isi[q].first/(double)(buff+1);
                dp[q][w]=min(dp[q][w],dp[q-1][w]+waktu);
                

                if(w==buff){
                    double sisa=suff[q+1][k-q]/(double)(buff+1);
                   
                    ans=min(ans,dp[q][w]+sisa);
                }
            }   
        }
        

    }
    cout<<fixed<<setprecision(10)<<ans<<endl;
}
#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...