zoukankan      html  css  js  c++  java
  • UOJ 52 元旦激光炮

    http://uoj.ac/problem/52

    题意:每次可以得到3个序列中

    思路:每次分别取出三个序列的K/3长度的位置,取最小的那个,然后每次减掉它,总复杂度是Nlog3N

    #include "kth.h"
    #include<algorithm>
    int C[2000005];
    int query_kth(int n_a, int n_b, int n_c, int k)
    {   
        
           
        int Len=k;
        int la=0,lb=0,lc=0;
        int ans=0;
        while (Len>3){
            int va=2147483647,vb=2147483647,vc=2147483647;
            int lena=std::min(Len/3,n_a-la+1);
            int lenb=std::min(Len/3,n_b-lb+1);
            int lenc=std::min(Len/3,n_c-lc+1);
            if (lena>=1) va=get_a(la+lena-1);
            if (lenb>=1) vb=get_b(lb+lenb-1);
            if (lenc>=1) vc=get_c(lc+lenc-1);
            if (va<=vb&&va<=vc){
               la+=lena;
               Len-=lena;
               ans=std::max(ans,va);
            }else
            if (vb<=va&&vb<=vc){
               lb+=lenb;
               Len-=lenb;
               ans=std::max(ans,vb);
            }else
            if (vc<=va&&vc<=vb){
               lc+=lenc;
               Len-=lenc;
               ans=std::max(ans,vc);
            }
        }
        int cnt=0;
        int lena=std::min(Len,n_a-la+1);
        int lenb=std::min(Len,n_b-lb+1);
        int lenc=std::min(Len,n_c-lc+1);    
        for (int i=1;i<=lena;i++)
            C[++cnt]=get_a(la+i-1);
        for (int i=1;i<=lenb;i++)
            C[++cnt]=get_b(lb+i-1);
        for (int i=1;i<=lenc;i++)
            C[++cnt]=get_c(lc+i-1);
        std::sort(C+1,C+1+cnt);
        for (int i=1;i<=Len;i++)
            ans=std::max(ans,C[i]);
        
        return ans;
        
    }
  • 相关阅读:
    JBuilder链接sql server数据库
    各种数据库连接代码(java)
    各种数据库连接代码的测试类(java)
    简单数据查询语句
    Oracle卸载
    Java字符串转换
    静态类示例
    授权对象的检查
    BAPI
    clear、REFRESH、free区别
  • 原文地址:https://www.cnblogs.com/qzqzgfy/p/5689800.html
Copyright © 2011-2022 走看看