답안 #916077

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
916077 2024-01-25T08:42:21 Z yeediot Let's Win the Election (JOI22_ho_t3) C++14
0 / 100
322 ms 4744 KB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define pb push_back
#define pii pair<int,int>
#define F first
#define S second
#define all(X) X.begin(),X.end()
#define chmax(a,b) a=max(a,b)
#define chmin(a,b) a=min(a,b)
#ifdef local
void setio(){freopen("/Users/iantsai/Library/Mobile Documents/com~apple~CloudDocs/cpp/Empty.md","r",stdin);}
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
void setio(){}
#define debug(x...)
#endif
bool cmp(pii a,pii b){
    if(a.S!=b.S)return a.S<b.S;
    return a.F<b.F;
}
const int inf=2e12;
signed main(){
    cout<<fixed<<setprecision(10);
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    setio();
    int n,k;
    cin>>n>>k;
    vector<pii>vec;
    vec.pb({0,0});
    for(int i=0;i<n;i++){
        int a,b;
        cin>>a>>b;
        vec.pb({a,b});
        if(b==-1){
            vec[i+1].S=inf;
        }
    }
    sort(all(vec),cmp);
    vector<vector<int>>suf(n+2,vector<int>(k+2,inf));
    for(int i=1;i<=k;i++){
        multiset<int>st;
        int sum=0;
        for(int j=n;j>=1;j--){
            st.insert(vec[j].F);
            sum+=vec[j].F;
            if((int)(st.size())>i){
                sum-=*prev(st.end());
                st.erase(prev(st.end()));
            }
            if((int)(st.size())<i){
                suf[j][i]=inf;
            }
            else{
                suf[j][i]=sum;
            }
        }
    }
    double ans=inf;
    for(int p=0;p<=k;p++){
        vector<vector<double>>dp(n+1,vector<double>(p+1,inf));
        dp[0][0]=0;
        for(int i=1;i<=k;i++){
            for(int j=0;j<=p;j++){
                if(j)dp[i][j]=dp[i-1][j-1]+(double)vec[i].S/j;
                dp[i][j]=min(dp[i][j],dp[i-1][j]+(double)vec[i].F/(p+1));
                //cout<<i<<' '<<j<<' '<<dp[i][j]<<' '<<vec[i].F<<'\n';
                if(j==p){
                    chmin(ans,dp[i][j]+(double)suf[i+1][k-i]/(p+1));
                    //cout<<i<<' '<<j<<' '<<ans<<' '<<dp[i][j]<<'\n';
                }
            }
        }
        //cout<<ans<<'\n';
    }
    cout<<ans<<'\n';
}




# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 275 ms 4740 KB Output is correct
2 Correct 282 ms 4744 KB Output is correct
3 Correct 322 ms 4616 KB Output is correct
4 Incorrect 253 ms 4716 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -