zoukankan      html  css  js  c++  java
  • cf1158A-The Party and Sweets

    题意:有n个男孩,m个女孩,每个男孩给每个女孩一堆糖果。b数组表示每个男孩给出的最少糖果数,g数组表示每个女孩子收到的最大糖果数。求所有男孩给出的最小糖果总数。

    解题:

    先对b数组和g数组从小到大排序。

    1.如果给出最多的男孩 比 收到最少的女孩的还多,b[n-1]>g[0],则不成立

    举例:

    3 2

    1 2 100

    8 300

    第三个男孩对每个女孩最少给出100个,第一个女孩你说你最多收到8个?不成立,直接输出-1

    2.一共有n*m堆糖果,显然g数组的糖果数 只能出现一次(女孩收到的最大堆糖果只有一次,其他都是很小堆,能多小就多小),直接让最后一个男孩发 每个女孩的最大堆糖果。

    (1)如果b[n-1]<g[0]

    比如:

    3 2 

    1 2 8

    9 100

    第三个男孩需要给出一堆8个的,再去满足所有g数组,但是加上本来的一堆8个,第三个男孩一共给出2堆,取一堆8个的,只能再分配一个g数组元素,则剩下一个g数组元素需要其他男孩分配,就让第二个男孩来提供。

    最终是,第一个男孩给了1,1两堆,第二个男孩给了2,9两堆,第三个男孩给了8,100两堆

    1+1+2+9+8+100=121

    如果g[0]让第一个男孩给出,则第一个男孩给了1,9两堆,第二个男孩给了2,2两堆,第三个男孩给了8,100两堆

    1+9+2+2+8+100=122

    用贪心策略不难推出是倒数第二个男孩满足第一个女孩的最大堆

    (2)如果b[n-1]=g[0]

    比如:

    3 2 

    1 2 8

    8 100

    第三个男孩在给出一堆8个的情况下 顺便满足了第一个女孩,那么他可以满足所有的女孩的最大堆。

    则第一个男孩给了1,1两堆,第二个男孩给了2,2两堆,第三个男孩给了8,100两堆

    1+1+2+2+8+100=114

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<iostream>
    #include<cstring>
    #include<queue>
    #define inf 0x3f3f3f3f
    #define ll long long
    using namespace std;
    
    ll n,m;
    ll b[100086];
    ll g[100086];
    
    int main()
    {
        while(scanf("%lld %lld",&n,&m)!=EOF)
        {
            for(ll i=0;i<n;i++)
                scanf("%lld",&b[i]);
            for(ll i=0;i<m;i++)
                scanf("%lld",&g[i]);
            sort(b,b+n);
            sort(g,g+m);
            if(b[n-1]>g[0])
            {
                printf("-1
    ");
            }
            else
            {
                ll sum=0;
                if( b[n-1]==g[0] )
                {
                    for(ll i=0;i<n-1;i++)
                        sum+=b[i]*m;
                    for(ll i=0;i<m;i++)
                        sum+=g[i];
                }
                else
                {
                    for(ll i=0;i<n-1;i++)
                        sum+=b[i]*m;
                    sum=sum-b[n-2]+g[0]+b[n-1];
                    for(ll i=1;i<m;i++)
                        sum+=g[i];
                }
                printf("%lld
    ",sum);
            }
        }
        return 0;
    }
    cf1158A
  • 相关阅读:
    程序员追求的是什么?
    jQuery弹出层始终垂直居中,相对于屏幕,相对于当前窗口
    在VMware上制作一个简单的Linux
    Nginx 反向代理+Varnish 技术
    在做微信分享到朋友圈时,手机扫码报config:invalid signature,分享后后正常的问题,是url问题...
    phpStudy本地环境测试,打开网页很慢的解决办法!
    windows上安装redis并安装php5.6的redis扩展
    Redis 安装
    redis 查看的版本
    who is 规格严格
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/10914224.html
Copyright © 2011-2022 走看看