愿各位程序员都能记住,输出第一条hello world时候的心情。坚持下去,你的每一条代码都在默默的改变世界,加油!加油!加油! “这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。 什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。 人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。

可爱女孩的聚会 【贪心】

 

 

 

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

 

本蒟蒻谢谢大家观看

 

 

 

题目:

 

题目描述:

小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\n");
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\n",ans+yzl);
53     return 0;
54 }
复制代码

 

 

 

 
posted @   max_lemon  阅读(173)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
Live2D
欢迎阅读『可爱女孩的聚会 【贪心】』
别人恋爱不成功,你连暗恋都不成功! 你写不出代码的原因只有一个,那就是你没有彻底理解这个算法的思想!!-----沃茨·基硕德
点击右上角即可分享
微信分享提示