zoukankan      html  css  js  c++  java
  • set的应用

    F. 买蛋糕 Problem 4833  ] Discussion ]


    Description

    RB买了个大蛋糕结果发现还是不够吃…… 
     

    因为蛋糕不够吃,所以RB只能再去麦都买一些小蛋糕来分给朋友吃,RB的每个朋友都有一个吃蛋糕的最小体积要求,即小于这个体积的蛋糕那个朋友就不吃,即对于朋友ii,蛋糕的最小体积要求为ai,若第jj块蛋糕的体积vj<ai,则朋友ii就不吃蛋糕jj,RB急匆匆的赶到麦都,结果发现麦都的蛋糕不多了,只剩下柜台里的一些蛋糕
    RB想知道,他应该买哪些蛋糕,才能让朋友都吃到蛋糕,且购买的蛋糕的总体积最小?
    ps:如果怎么买都有朋友吃不到蛋糕,那RB就只能回去QAQ一下卖个萌了…… 

    Input

    输入包含多组数据,每组数据第一行有两个正整数n,m,第二行有nn个正整数,分别代表每个朋友的最小蛋糕体积要求,第三行有m个整数,分别代表麦都柜台里剩余的蛋糕的体积。**输入以n=0n=0且m=0结束**

    Output

    对于每组数据,输出最小体积,如果无解,输出QAQ。

    Samples

    Input Copy
    2 3
    5 4
    7 8 4
    2 1
    5 5
    10
    0 0
    Output
    11
    QAQ
    Input Copy
    8 13
    1 28 18 25 24 7 25 11
    18 9 48 44 29 50 40 24 17 25 21 12 22
    12 13
    14 24 4 17 27 23 27 18 28 21 20 21
    19 43 21 12 36 47 15 14 43 40 10 5 23
    0 0
    Output
    174
    QAQ

    Hint

    • 对于前40%的数据,n,m20
    • 对于前60%的数据,n,m100
    • 对于前70%的数据,n,m1e5,且只有1组测试数据。
    • 对于100%的数据,n,m1e6,有3至5组测试数据。

    由于输入的数据量较大,请使用速度较快的读入方式。 

    题意就是每个小朋友都拿比自己a[i]大的b[i]问你拿完之后,ans最小是多少

    这个要提的就是如何返回set中最后一个元素*st.rbegin()

    #pragma GCC optimize(1)
    #pragma GCC optimize(2)
    #pragma GCC optimize(3,"Ofast","inline")
    #include<iostream>
    #include<set>
    #include<stdio.h>
    #include<algorithm>
    #include<cstring>
    /*
    二分+set;
    就是要判断序列的最后一个元素 
    */
    using namespace std;
    typedef long long ll;
    template <typename Tp>
    void read(Tp &x){//read(n);
        x=0;char ch=1;int fh;
        while(ch!='-'&&(ch>'9'||ch<'0')){
            ch=getchar();
        }
        if(ch=='-'){
            fh=-1;ch=getchar();
        }else fh=1;
        while(ch>='0'&&ch<='9'){
            x=(x<<1)+(x<<3)+ch-'0';ch=getchar();
        }
        x*=fh;
    }
    const int maxn=5e6+100;
    const int mod=1991;
    int n,m;
    ll a[maxn];
    multiset<ll>st;
    int main(){
        while(scanf("%d%d",&n,&m)){
            if(n+m==0){
                break;
            }
            for(register int i=1;i<=n;i++){
                read(a[i]);
            }
            ll x;
            for(register int j=1;j<=m;j++){
                read(x);
                st.insert(x);
            }
            sort(a+1,a+n+1);
            ll ans=0;
            int flag=1;
            for(register int i=1;i<=n;i++){
                if(st.empty()||*st.rbegin()<a[i]){//返回set最后一个元素 
                    flag=0;
                    break;
                }
                else{
                    multiset <ll>::iterator z=st.lower_bound(a[i]);
                    ans+=*z;
                    st.erase(z); 
                }
            }
            if(flag){
                printf("%lld
    ",ans);
            }
            else{
                printf("QAQ
    ");
            }
            st.clear();
        }
        
    }
  • 相关阅读:
    集训总结
    目前世界四大杀毒软件各自的特点
    俺们家老祖宗是搞音乐的
    灰姑娘
    自欺欺人的ie7pro去掉msnlivespaces的顶部广告图片
    利用工具及api接口写博文
    在C#中,异步调用的WebService、Socket及新建线程中操作主线程中UI的方法
    Ubuntu 12.04下载址
    js与php互传参数
    php使用strstr函数 ,判断字符串A中是否含有字符串B
  • 原文地址:https://www.cnblogs.com/lipu123/p/14423955.html
Copyright © 2011-2022 走看看