二分样例全过wa了一半多
查看原帖
二分样例全过wa了一半多
378195
icaijy楼主2024/10/8 19:46
#include <bits/stdc++.h>
#define int long long
using namespace std;

double n,a[105],b[105],q[105],p[105],x;

bool check(int num){
    int sum=0;
    for (int i=1;i<=n;i++){
        int ans,l=0,r=num,mid;
        if (p[i]/a[i]>q[i]/b[i]){
            ans=ceil(num/b[i])*q[i];
            while (l<=r){
                mid=(l+r)/2;
                if (mid*p[i]+ceil((num-mid*a[i])/b[i])*q[i]<ans){
                    l=mid+1;
                    ans=mid*p[i]+ceil((num-mid*a[i])/b[i])*q[i];
                }
                else r=mid-1;
            }
        }
        else {
            ans=ceil(num/a[i])*p[i];
            while (l<=r){
                mid=(l+r)/2;
                if (mid*q[i]+ceil((num-mid*b[i])/a[i])*p[i]<ans){
                    l=mid+1;
                    ans=mid*q[i]+ceil((num-mid*b[i])/a[i])*p[i];
                }
                else r=mid-1;
            }
        }
        sum+=ans;
    }
    return sum<=x;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>x;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>p[i]>>b[i]>>q[i];
    }
    check(5);
    int l=0,r=1145141919810,mid,ans;
    while (l<=r){
        mid=(l+r)/2;
        if (check(mid)){
            ans=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    cout<<ans;
}

感觉样例数据已经很强了,到底是哪里出了问题呢?

2024/10/8 19:46
加载中...