转载请注明出处:http://blog.csdn.net/u012860063

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4585

Problem Description
Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temple every year, trying to be a monk there. The master of Shaolin evaluates a young man mainly by his talent on understanding the Buddism scripture, but fighting skill is also taken into account.
When a young man passes all the tests and is declared a new monk of Shaolin, there will be a fight , as a part of the welcome party. Every monk has an unique id and a unique fighting grade, which are all integers. The new monk must fight with a old monk whose fighting grade is closest to his fighting grade. If there are two old monks satisfying that condition, the new monk will take the one whose fighting grade is less than his.
The master is the first monk in Shaolin, his id is 1,and his fighting grade is 1,000,000,000.He just lost the fighting records. But he still remembers who joined Shaolin earlier, who joined later. Please recover the fighting records for him.
Input
There are several test cases.
In each test case:
The first line is a integer n (0 <n <=100,000),meaning the number of monks who joined Shaolin after the master did.(The master is not included).Then n lines follow. Each line has two integer k and g, meaning a monk's id and his fighting grade.( 0<= k ,g<=5,000,000)
The monks are listed by ascending order of jointing time.In other words, monks who joined Shaolin earlier come first.
The input ends with n = 0.
Output
A fight can be described as two ids of the monks who make that fight. For each test case, output all fights by the ascending order of happening time. Each fight in a line. For each fight, print the new monk's id first ,then the old monk's id.
Sample Input
3 2 1 3 3 4 2 0
Sample Output
2 1 3 2 4 2
Source
2013ACM-ICPC杭州赛区全国邀请赛
Recommend
We have carefully selected several similar problems for you:  4846 4845 4844 4843 4842 

题意:

有N个依次进入少林。 每次输出, 新进和尚 和 战斗等级与其最接近的旧和尚的ID。  ID , 和 战斗等级都是唯一的。

代码例如以下:

第一种暴力:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
struct man
{int id;int g;int d;int num;
} p[100047];
bool cmp1(man a , man b)
{return a.g < b.g;
}
bool cmp2(man a , man b)
{return a.num < b.num;
}
int test(int a)
{if( a < 0)a = -a;return a;
}
int main()
{int n,m,i,j,t;while(scanf("%d",&n) && n){for(i = 0 ; i < n ; i++){scanf("%d%d",&p[i].id,&p[i].g);p[i].num = i+1;}sort(p,p+n,cmp1);//按等级从小到大for(i = 0 ; i < n ; i++){p[i].d = 1;t = 1000000000-p[i].g;for(j = i+1 ; j < n ; j++)//找比当先和尚等级高且最接近的{if(p[i].num > p[j].num){t = test(p[j].g - p[i].g);p[i].d=p[j].id;break;}}for(j = i-1 ; j >= 0 ; j--)//找比当前和尚等级低且最接近的{if(p[i].num > p[j].num){if(t >= test(p[i].g-p[j].g)){p[i].d = p[j].id;}break;}}}sort(p,p+n,cmp2);//按和尚进少林寺的顺序排for(i = 0 ; i < n ; i++){printf("%d %d\n",p[i].id,p[i].d);}}return 0;
}

另外一种(STL):

代码例如以下:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define PI acos(-1.0)
#define INF 0x3fffffff
int main()
{int id,g,n;map<int,int>m;set<int>s;while(~scanf("%d",&n) && n){s.clear ();m.clear ();s.insert(1000000000);m[1000000000]=1;for(int i = 0 ; i < n ; i++){scanf("%d%d",&id,&g);printf("%d ",id);set<int>::iterator it = s.lower_bound(g);if(it == s.end()){it--;printf("%d\n",m[*it]);}else{int t = *it;if(it != s.begin()){it--;if(g - (*it) <= t - g){printf("%d\n",m[*it]);}else{printf("%d\n",m[t]);}}else{printf("%d\n",m[*it]);}}m[g] = id;s.insert(g);}}return 0;
}

转载于:https://www.cnblogs.com/ljbguanli/p/7097216.html

hdu 4585 Shaolin两种方法(暴力和STL map set)相关推荐

  1. python生成100个随机数_Python_0——100闭区间产生3个随机数,两种方法排序

    ''' 题目:0--100闭区间产生3个随机数,两种方法排序 法1:暴力遍历 法2:max(a,b,c)min(a,b,c) 注意:random,radint(0--100)产生随机数 '''impo ...

  2. java数组循环扩容_Java中实现数组动态扩容的两种方法

    Java中实现数组动态扩容的两种方法 java中初始化一个数组需要定义数组的容量,而在我们使用数组时往往会遇到数组容量不够的情况,此时我们就需要通过动态扩容的方式来来根据需求扩大数组的容量. 我们可以 ...

  3. sqrt函数模拟实现的两种方法

    起因:在leetcode刷题时,有一道题目考察了有关sqrt的原理的题目,当时就去查了网上的文章,结果发现,一开始的时候看的很懵,最后也是搞定了两种方法,今天我就以最简单的方式写下这两种方式的思路讲解 ...

  4. js删除指定html及子标签,js中如何删除某个元素下面的所有子元素?(两种方法)...

    js中如何删除某个元素下面的所有子元素?(两种方法) 一.总结 方法一:通过元素的innerHTML属性 元素element.innerHTML=""; 方法二:通过元素的remo ...

  5. linux 开机连接wifi密码忘了怎么办,WIFI密码忘了怎么办 两种方法轻松找回密码

    WIFI密码我们设置过一次之后基本上就是永久自动连接了,久而久之,自己也忘记了密码是多少了.当有客人来你家的时候,询问你要WIFI密码你却无从说起.WIFI密码忘了怎么办,今天小编要交大家几个方法找回 ...

  6. Java实现条件性参加会议问题(两种方法)

    有人邀请A,B,C,D,E,F 6个人参加一项会议,这6个人有些奇怪,因为他们有很多要求,已知: 1)A,B两人至少有1人参加会议:   2)A,E,F 3人中有2人参加会议:   3)B和C两人一致 ...

  7. SQL Server中灾难时备份结尾日志(Tail of log)的两种方法

    简介 在数据库数据文件因各种原因发生损坏时,如果日志文件没有损坏.可以通过备份结尾日志(Tail of log)使得数据库可以恢复到灾难发生时的状态. 例如: 上图中.在DB_1中做了完整备份,在Lo ...

  8. C++/C++11中用于定义类型别名的两种方法:typedef和using

    类型别名(type alias)是一个名字,它是某种类型的同义词.使用类型别名有很多好处,它让复杂的类型名字变得简单明了.易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的.在C++中,任何 ...

  9. jquery-12 折叠面板如何实现(两种方法)

    jquery-12 折叠面板如何实现(两种方法) 一.总结 一句话总结:1.根据点击次数来判断显示还是隐藏,用data方法保证每个元素一个点击次数:2.找到元素的下一个,然后toggle实现显示隐藏. ...

  10. java 匿名list,java创造匿名对象的两种方法

    在java中有时候需要一些匿名对象的使用.可能有些小伙伴拿还不会创造,其实我们在学习一些方法时都或多或少的接触过.本篇所要讲到的创造匿名对象总结了两种方法,分别是静态工具方法和Lambda表达式,我们 ...

最新文章

  1. Blender建筑可视化技能学习视频教程
  2. .Net简单上传与下载
  3. (转载)Ubuntu命令卸载软件
  4. ITK:两条曲线上所有点之间的平均距离
  5. Python-基础知识-控制流程和文件操作
  6. vGPU作为主流平台的进化之路
  7. OpenStack三种类型的NAT转换
  8. 最多金的编程语言Top10:Python第3,R第10,你猜第1是谁?
  9. ARM编程模式和7钟工作模式
  10. tkinter Canvas画图片大坑总结
  11. 需求管理-需求的结构
  12. Cisco Router WEB管理
  13. N039_自动标记地区_import_cpca自动提取省市区和详细地址
  14. 数模比赛经验分享(美赛分享)
  15. 建模的计算机基础理论,数学建模基础理论
  16. 如何下载专利(国内)
  17. 轻断食过程中的身体变化
  18. WACV 2021 论文大盘点-医学影像篇
  19. CSS3动画animation认识和Animate.css的使用
  20. 埃尔米特多项式 (Hermite Polynomials)简介(2)

热门文章

  1. drupal 电商网站_为什么小型企业应该为电子商务网站选择Drupal
  2. 朱晔的互联网架构实践心得S1E10:数据的权衡和折腾【系列完】
  3. 一个按钮控制定时器的开始与暂停
  4. MSP430F415IRTDR
  5. 冬至幻灵怎么修改服务器名字,冬至幻灵如何给自己加元宝
  6. 用计算机算桥架的视频,桥架在线计算器介绍
  7. 刘林仙版《薛刚反唐》整理
  8. 五一,我们来欣赏一篇宋词
  9. Google OpenThread 技术研讨会
  10. adprw指令教程_三菱FX5U模拟量,通信,运动控制详解