• 可爱女孩的聚会 【贪心】


    本人水平有限,题解不到为处,请多多谅解

    本蒟蒻谢谢大家观看

    题目:

    题目描述:

    小W是一个可爱的女孩子,她很喜欢和朋友聚会。

    这次聚会有一共有n+m个人,其中有n个男孩子和m个女孩子。为了展现自己的绅士风度,每一个男孩子都为女孩子们准备了礼物。

    不过由于各个女孩子在每个男孩子心中的地位不同,因此每个男孩子给各个女孩子的礼物数量不一定相同。

    现在小W知道了第个男孩子送给每个女孩子的礼物数量中最少的是ai,第j个女孩子收到的最多的礼物数量为bj,她想要知道女孩子们收到的总礼物数量最少是多少。

    由于有些人的数学不好,因此可能会数错自己的礼物数量,所以如果不存在满足条件的情况,请输出-1

    输入格式

    第一行两个整数,n和m

    第二行n个整数,第i个数为ai

    第三行m个整数,第i个数为bi

    输出格式

    仅一行,输出你的答案。

    样例:

    样例输入1
    3 2
    1 2 1
    3 4

    样例输出1
    12
    样例输入2
    2 2
    0 1
    1 0
    样例输出2
    -1


    题目大意如下:女孩们收集到的礼物最多为bj,每个男孩必须送各个女孩最少为ai,且送的礼物必须要有最少的。

    样例如下:

     

    贪心策略: 

    可以先把男生与女生的都排序一遍

    为求最小,所以尽量让最大的男生值给的最多,并且直至女生最小值(因为此时必须为男生,题目要求:必须有最少的)

    我们先把其余男生值累加

    再特判一下:当女生min与男生max相等时,这时直接抵消

    如果女生min与男生max不相等时,我们要让男生的次大值变为女生min,因为此前我们已经都累加了一遍,这时差值应为(b[min]-a[次大值])

    最后加上差值即可

    code:

     1 #include<bits/stdc++.h>
     2 #define int long long
     3 #pragma GCC optimize(3)
     4 const int N=1e6+10;
     5 using namespace std;
     6 int n,m;
     7 int a[N],b[N],ans,yzl;
     8 void inint() {
     9     freopen("party.in", "r", stdin);
    10     freopen("party.out", "w", stdout);
    11 }
    12 inline int read(){
    13     int x=0,f=1;char ch=getchar();
    14     while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    15     while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    16     return x*f;
    17 }
    18 inline void write(int x)
    19 {
    20     if(x<0)x=-x,putchar('-');
    21     if(x>9)write(x/10);
    22     putchar(x%10+'0');
    23 }
    24 bool cmp(int a,int b){
    25     return a>b;
    26 }
    27 signed main()
    28 {
    29     //inint();
    30     n=read(),m=read();
    31     for(int i=1;i<=n;i++){
    32         a[i]=read();
    33     }
    34     sort(a+1,a+n+1,cmp);
    35     for(int i=1;i<=m;i++){
    36         b[i]=read();
    37     }
    38     sort(b+1,b+m+1,cmp);
    39     if(a[1]>b[m]){
    40         printf("-1
    ");
    41         return 0;
    42     }
    43     for(int i=1;i<m;i++){
    44         ans+=b[i];
    45     }
    46     ans+=a[1];
    47     for(int i=2;i<=n;i++){
    48         ans+=a[i]*m;
    49     }
    50     if(b[m]!=a[1])yzl=b[m]-a[2];
    51     else if(b[m]==a[1])yzl=b[m]-a[1];
    52     printf("%lld
    ",ans+yzl);
    53     return 0;
    54 }
     
  • 相关阅读:
    人月神话
    Rails 最佳实践
    萧伯纳名言名句大全
    听话,照做,执行,别发挥
    So Good They Can't Ignore You
    谈谈遵守公司作战纪律
    如何让自己有动力去长久地做一件事情
    新架构优化问题总结
    Markdown 入门
    关于代码版本管理的思考和建议
  • 原文地址:https://www.cnblogs.com/nlyzl/p/11773352.html
Copyright © 2020-2023  润新知