Sockets CF732E set map
题目:http://codeforces.com/problemset/problem/732/E
题目大意:
有n台电脑(computer)和m个插座(socket),两者均有一个power值,分别为 ai 和 bi ,只有当两者的power值相等时才可以匹配成功。当然,还有足够多个适配器(adapters)可用,插座每接一个适配器,bi 就会减半(取上整)。求最多可匹配多少电脑和插座,以及该种情况下所需要的最少的适配器数量。如有多种方案,输出其中一种即可。
思路:
因为这个题的输出都要用到下标(或编号),所以分别用multimap或pair存储电脑或插座的power值和对应的下标,从最小的插座power开始,匹配对应的电脑power,如果存在则记录,如果无匹配,则将插座power折半继续匹配直到值为1都未匹配成功,那么就说明该插座无论如何都无法匹配到电脑。这样可以使得当前情况下能够匹配到最大的电脑数量而且用最少的适配器,至于查找匹配自然不能遍历,可以将电脑的power存入set容器中进行find查找,效率会高一点,搜索复杂度为logN。
代码如下:
#include<iostream>
#include<algorithm>
#include<utility>
#include<set>
#include<map>
using namespace std; const int MAX = 2e5 + ; multimap<int, int> P; //电脑与下标对应
multiset<int> S; //存放电脑power值,用set方便查找
pair<int, int> Sockets[MAX]; //插座与下标对应
int RESULT1[MAX], RESULT2[MAX]; int main()
{
int N, M, pi, si, c = , u = ;
cin >> N >> M;
for (int i = ; i <= N; ++i)
{
cin >> pi;
S.insert(pi);
P.insert(make_pair(pi, i));
}
for (int i = ; i <= M; ++i)
{
cin >> Sockets[i].first;
Sockets[i].second = i;
}
sort(Sockets + , Sockets + M + ); for (int i = , num = ; i <= M; ++i, num = )
while ()
{
multiset<int>::iterator set_it = S.find(Sockets[i].first);
if (set_it != S.end())
{
multimap<int, int>::iterator map_it = P.find(Sockets[i].first);
RESULT1[Sockets[i].second] = num;
RESULT2[(*map_it).second] = Sockets[i].second;
c++; u += num;
S.erase(set_it), P.erase(map_it);
break;
}
if (Sockets[i].first == )break;
num++;
Sockets[i].first = (Sockets[i].first + ) / ;
}
cout << c << " " << u << endl;
for (int i = ; i <= M; ++i)cout << RESULT1[i], i == M ? cout << endl : cout << " ";
for (int i = ; i <= N; ++i)cout << RESULT2[i], i == N ? cout << endl : cout << " ";
}
感谢您的阅读,生活愉快~
Sockets CF732E set map的更多相关文章
- Java网络编程之TCP
Java网络编程之TCP TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...
- Code Forces Gym 100886J Sockets(二分)
J - Sockets Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Valera ...
- Sockets
Sockets time limit per test 2 seconds memory limit per test 256 megabytes input standard input outpu ...
- PHP 调用 Go 服务的正确方式 - Unix Domain Sockets
* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...
- [Real World Haskell翻译]第27章 网络通信和系统日志 Sockets and Syslog
第27章 网络通信和系统日志 Sockets and Syslog 基础网络 在本书的前面几章,我们讨论了运转在网络上的服务.其中的两个例子是客户端/服务器架构的数据库和Web服务.当需要制定一个新的 ...
- Gym 100886J Sockets 二分答案 + 贪心
Description standard input/outputStatements Valera has only one electrical socket in his flat. He al ...
- Codeforces Round #377 (Div. 2) E. Sockets
http://codeforces.com/contest/732/problem/E 题目说得很清楚,每个电脑去插一个插座,然后要刚好的,电脑的power和sockets的值相同才行. 如果不同,还 ...
- 【20.69%】【codeforces 732E】Sockets
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- mapreduce中一个map多个输入路径
package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...
随机推荐
- 15个超级实用的jQuery插件
jQuery是一个可订制的.轻量级的前端开发框架,它会让你的前端开发拥有无限的可能性.它会在敏捷Web开发中帮你做很多事情,比如简化HTML文档的解析.事件处理.动画效果和Ajax交互.实践上jQue ...
- Jquery Ajax自定义无刷新提交表单Form
Jquery的$.ajax方法可以实现ajax调用,要设置url,post,参数等. 如果要提交现有Form需要写很多代码,何不直接将Form的提交直接转移到ajax中呢. 以前的处理方法 如Form ...
- 一些达成共识的JavaScript编码约定[转]
如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要.与其他 ...
- 洛谷P3959 [NOIP2017]宝藏
[题目描述] 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但 ...
- 关于初次使用Linux的一些小经验
前些天看了一下腾讯的招聘的网站,发现大多数开发都要求在Linux系统下进行,所以就赶紧装了个Ubuntu来玩玩,可是装了以后才发现,初次接触Linux就跟小学生差不多,大部分操作都要通过命令行来完成, ...
- 一个MMORPG的常规技能系统
广义的的说,和战斗结算相关的内容都算技能系统,包括技能信息管理.技能调用接口.技能目标查找.技能表现.技能结算.技能创生体(buff/法术场/弹道)管理,此外还涉及的模块包括:AI模块(技能调用者). ...
- pf
here Pro 排列n个不同的数成为长度为p的序列 每两个相同的数之间至少要隔着m个数 求排列总方案数 Input 三个整数 n,m,p output 输出一个数字表示序列组成方法,由于结果可能很大 ...
- 配置replica set的常见问题
总有人问起配置ReplicaSet不成功,总结了一下基本上的可能性就几种,检查步骤如下: 假设三台机器的IP分别是 A: 192.168.1.2 a.test.com B:192.168.1.3 b. ...
- 【codeforces】【比赛题解】#940 CF Round #466 (Div. 2)
人生的大起大落莫过如此,下一场我一定要回紫. [A]Points on the line 题意: 一个直线上有\(n\)个点,要求去掉最少的点,使得最远两点距离不超过\(d\). 题解: 暴力两重fo ...
- 【黑客免杀攻防】读书笔记15 - 源码免杀、C++壳的编写
1.源码免杀 1.1 定位产生特征的源码 定位文件特征 1.根据MyCCL的特征码定位工具,定位出有特征的地址 2.根据VS的反汇编窗口,输入有特征的地址得到特征地址与源码的关系 3.插入Messag ...