01分数规划

那么
图片说明

图片说明

图片说明
显然我们应该把最大的k个数放进去。单次复杂度n*log(n);
可以接受
牛客上的题太坑l。。。。。。。。
https://loj.ac/problem/149

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
long long a[maxn], b[maxn], new1[maxn];
int n, m;
bool check(long long x) {
    priority_queue<long long> op;
    for (int i = 1; i <= n; i++) {
        op.push(a[i] - b[i] * x);
        //    cout<<a[i]-b[i]*x<<" ";
    }
    //    cout<<endl;
    long long now = 0, ans = 0;
    int t = n + 10;
    while (t--) {
        ans += op.top();
        op.pop();
        now++;
        if (now == m)
            break;
    }
    return ans >= 0;
}
int main() {
    // freopen("35.in","r",stdin);
    //    int t=1e9+10;
    // while(t--) {
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    scanf("%d%d", &n, &m);
    //    if(n==0&&m==0)
    //    break;
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &a[i]);
        a[i] *= 1e5;
    }
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &b[i]);
        // b[i]*=1e5;
    }
    long long ans3 = 0;
    int l = 1, r = 1e6 + 10;
    while (l <= r) {
        int mid = ((l + r) / 2);
        //    cout<<"mid="<<mid<<endl;
        if (check(mid)) {
            l = mid + 1;
            ans3 = mid;
        } else
            r = mid - 1;
    }
    double rr = 1e5;
    double ans1 = (double)ans3 / (double)rr;
    printf("%.04f\n", ans1 + 0.00000001);
    // printf("%.4f",0.69595+0.000001);
    // printf("%.4f",0.95955);
    return 0;
}

记得最后四舍五入的话,0.69995
在里面存的是0.69994999999999999999999999
所以不会四舍五入,这时候要加上一个较小的数。
T2
https://www.luogu.org/problem/P2115
锣鼓上的一道题,相当于bi是1.emmm好了。。。。。。。。
图片说明
但是因为是连续的一段,所以需要维护一个最大子段和。然后看现在最小的行不行;

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
double a[maxn];
double b[maxn],need[maxn];
int n;
bool check(int x) {
    x=x;
    double x1=double(double(x)/100000);
    memset(need,-0x3f,sizeof(need));//不能是0,存在负数
    double sum=0;
    double ans1=need[0];
    for(int i=2; i<=n-1; i++) {
        need[i]=max(need[i-1]+(a[i]-x1),a[i]-x1);
        ans1=max(ans1,need[i]);
    }
    for(int i=1; i<=n; i++)
        sum+=(a[i]-x1);
    return sum-ans1<=0;
    //存在小于等于他的数 
}
int main() {
//freopen("1.in","r",stdin);
    cin>>n;
    double op;
    for(int i=1; i<=n; i++)
        cin>>a[i],op=max(op,a[i]);
    int l=1,r=int(op*100000);//可能出现必须取出一个的情况,这时候平均数大于总的平均数
    int ans=0;
    while(l<=r) {
        int mid=(l+r)/2;
        //    cout<<"mid="<<mid<<endl;
        if(check(mid)) {
            r=mid-1;
            ans=mid;
        } else {
            l=mid+1;
        }
    }
    //cout<<ans;
    printf("%.03f",double(ans)/100000+0.00000000001);
    return 0;
}

我真憨,真的。最后会有一个点会爆精度??????

全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
手撕没做出来是不是一定挂
Chrispp3:不会,写出来也不一定过
点赞 评论 收藏
分享
11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务