站外题求调
  • 板块学术版
  • 楼主ChpyX2
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/11 12:48
  • 上次更新2023/11/11 15:01:22
查看原帖
站外题求调
818475
ChpyX2楼主2023/11/11 12:48

rt

题面: 代码:

#include<bits/stdc++.h>
using namespace std;
struct node{
    int s,t;
    double a,b;
}pt[100005];
int n,t;
double dp[100005],suma=0,sumb=0;
bool cmp(node x,node y){
    return x.s>y.s;
}
bool check(double x){
    //判断只选 mid*Σb-Σa>=0 能否成功
    double sum=0;
    int maxt=0;
    for(int i=1;i<=n;i++){
        if(x*pt[i].b-pt[i].a>=0){
            sum+=x*pt[i].b-pt[i].a;
            if(maxt>=pt[i].s-1)maxt=max(maxt,pt[i].t);
        }
    }
    //如果不能,dp判断能否通过选某些额外服务器使其成功且<sum
    if(maxt==t)return 1;
    dp[0]=0;
    for(int i=1;i<=n;i++){
        double mn=1e9;
        for(int j=1;j<i;j++){
            if(pt[j].t>=pt[i].s-1)mn=min(dp[pt[j].t],mn);
        }
        if(maxt>=pt[i].s-1)mn=min(mn,0.0);
        if(pt[i].b*x-pt[i].a>=0)dp[pt[i].t]=max(dp[pt[i].t],mn);
        else dp[pt[i].t]=max(dp[pt[i].t],mn-pt[i].b*x+pt[i].a);
    }
    cout<<x<<" ";
    for(int i=1;i<=n;i++){
        cout<<dp[i]<<" ";
    }
    cout<<endl;
    return dp[t]<=sum;
}
int main(){
    cin>>n>>t;
    for(int i=1;i<=n;i++){
        cin>>pt[i].s>>pt[i].t>>pt[i].a>>pt[i].b;
        suma+=pt[i].a;
        sumb+=pt[i].b;
    }
    // sort(pt+1,pt+1+n,cmp);
    double l=1,r=1005;
    while(r-l>1e-4){
        double mid=(l+r)/2.0;
        if(check(mid))r=mid;
        else l=mid;
    }
    printf("%.3f",r);
    system("pause");
    return 0;
}
//from chpyx2
/*
    mid*Σb-Σa>=0
*/

2023/11/11 12:48
加载中...