• POJ 2010(二分


    开始写这个题的之后怎么写都些不对,而且因为考虑到分数相等的情况所以写的比较复杂(也可能是别的原因)一直WA,后来参考了大神的博客,其实对于这种二分的题目,如果有相等的情况,排个序人为加一个标准让所有元素可比就可以直接二分了嘛

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<utility>
    #include<vector>
    #define INF 0x3fffffff
    using namespace std;
    typedef long long ll;
    int N,C,F;
    const int maxv=1e5+30;
    
    struct cow{
        int od,a,s;
    }A[maxv];
    bool cmp_s(cow a,cow b){
        return a.s<b.s;
    }
    bool cmp_a(cow a,cow b){
        return a.a<b.a;
    }
    int getans[maxv],getaid[maxv];
    int main(){
        freopen("in.txt","r",stdin);
        cin>>N>>C>>F;
        for(int i=0;i<C;i++) scanf("%d%d",&A[i].s,&A[i].a);
        sort(A,A+C,cmp_s);
        for(int i=0;i<C;i++) A[i].od=i,getans[i]=A[i].s,getaid[i]=A[i].a;
        sort(A,A+C,cmp_a);
        ll ans=-1;
        ll l=-1,r=C;
        ll half=N>>1;
        while(r-l>1){
            ll mid=(r+l)>>1;
            ll tol=getaid[mid];
            ll low=0,upp=0,mida=0;
            for(int i=0;i<C;i++){
                if(A[i].od<mid&&tol+A[i].a<=F&&low<half){
                    low++;
                    tol+=A[i].a;
                }
                else if(A[i].od>mid&&tol+A[i].a<=F&&upp<half){
                    upp++;
                    tol+=A[i].a;
                }
            }
            if(low<half&&upp<half)
                break;
            else if(low>=half&&upp>=half){
                ans=getans[mid];
                l=mid;
            }
            else if(low<half){
                l=mid;
            }
            else
                r=mid;
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    java 实现图表展示
    jar包可以到maven下载
    eclipse java ee 添加jrebel 工具
    单链表逆序
    面试-准备
    面试基础知识整理
    mysql中CONCAT值为空的问题解决办法
    数字签名 数字证书
    java 内存泄露分析(jmap + MemoryAnalyzer)
    Chrome 控制台console的用法
  • 原文地址:https://www.cnblogs.com/Cw-trip/p/4470907.html
Copyright © 2020-2023  润新知