可爱女孩的聚会 【贪心】
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:
题目描述:
小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 }