可爱女孩的聚会 【贪心】

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

本蒟蒻谢谢大家观看

题目:

题目描述:

小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 }
 
原文地址:https://www.cnblogs.com/nlyzl/p/11773352.html