题意:有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[];
ll g[]; int main()
{
while(scanf("%lld %lld",&n,&m)!=EOF)
{
for(ll i=;i<n;i++)
scanf("%lld",&b[i]);
for(ll i=;i<m;i++)
scanf("%lld",&g[i]);
sort(b,b+n);
sort(g,g+m);
if(b[n-]>g[])
{
printf("-1\n");
}
else
{
ll sum=;
if( b[n-]==g[] )
{
for(ll i=;i<n-;i++)
sum+=b[i]*m;
for(ll i=;i<m;i++)
sum+=g[i];
}
else
{
for(ll i=;i<n-;i++)
sum+=b[i]*m;
sum=sum-b[n-]+g[]+b[n-];
for(ll i=;i<m;i++)
sum+=g[i];
}
printf("%lld\n",sum);
}
}
return ;
}

cf1158A

cf1158A-The Party and Sweets - (贪心+思维)的更多相关文章

  1. Mike and distribution CodeForces - 798D (贪心+思维)

    题目链接 TAG: 这是我近期做过最棒的一道贪心思维题,不容易想到,想到就出乎意料. 题意:给定两个含有N个正整数的数组a和b,让你输出一个数字k ,要求k不大于n/2+1,并且输出k个整数,范围为1 ...

  2. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  3. 贪心/思维题 Codeforces Round #310 (Div. 2) C. Case of Matryoshkas

    题目传送门 /* 题意:套娃娃,可以套一个单独的娃娃,或者把最后面的娃娃取出,最后使得0-1-2-...-(n-1),问最少要几步 贪心/思维题:娃娃的状态:取出+套上(2),套上(1), 已套上(0 ...

  4. 贪心/思维题 UVA 11292 The Dragon of Loowater

    题目传送门 /* 题意:n个头,m个士兵,问能否砍掉n个头 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 */ #include <cstdio> #include <c ...

  5. T - Posterized(贪心思维)

    Description Professor Ibrahim has prepared the final homework for his algorithm’s class. He asked hi ...

  6. C. Coffee Break 贪心 思维 有点难 有意思

    C. Coffee Break 这个贪心之前好像写过,还是感觉挺难的,有点不会写. 这个题目大意是:给你一个数列n个元素,然后给你一天的时间,给你一个间隔时间d, 问你最少要用多少天可以把这个数列的所 ...

  7. hdu 4803 贪心/思维题

    http://acm.hdu.edu.cn/showproblem.php?pid=4803 话说C++还卡精度么?  G++  AC  C++ WA 我自己的贪心策略错了 -- 就是尽量下键,然后上 ...

  8. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...

  9. C. Brutality Educational Codeforces Round 59 (Rated for Div. 2) 贪心+思维

    C. Brutality time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

随机推荐

  1. 怎么用命令行把apk安装到移动设备上?

    1.移动设备通过USB连接电脑 2.执行命令adb install [apk文件的路径]

  2. for循环中的switch的break和continue作用范围

    for循环中的switch的break和continue作用范围 不空泛的讲理论了,上代码.看下面这个代码: #include <stdio.h> #include <stdlib. ...

  3. nginx location指令详解

    Nginx的HTTP配置主要包括三个区块,结构如下: http { //这个是协议级别 include mime.types; default_type application/octet-strea ...

  4. C#中精确计时的一点收获 Stopwatch

    http://www.cnblogs.com/jintianhu/archive/2010/09/01/1815031.html 参考: https://www.cnblogs.com/kissdod ...

  5. NModbus4 读取串口设备数值

    使用NModbus4 读取串口 public static void aget() { byte[] array = new byte[8]; using (SerialPort port = new ...

  6. MVC伪静态路由简单搭配

      public static void RegisterRoutes(RouteCollection routes)         {             routes.IgnoreRoute ...

  7. HTTP发展简史

    HTTP发展简史 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...

  8. Java 控制流程 之 循环语句

    循环:循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一 ...

  9. python3常用的内置函数

    数学相关 abs(a) : 求取绝对值.abs(-1) max(list) : 求取list最大值.max([1,2,3]) min(list) : 求取list最小值.min([1,2,3]) su ...

  10. Cheat Engine 基本用法

    打开游戏 当前血量2620 打开Cheat Engine 扫描2620 掉点血 再次扫描2600 此时,会根据第一次扫描结果,再次扫描 扫描成功 将数据放到修改区,点击箭头 修改数据 双击Value进 ...