hdu 4585 Shaolin两种方法(暴力和STL map set)

转载请注明出处: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;
}
时间: 2024-10-12 20:40:40

hdu 4585 Shaolin两种方法(暴力和STL map set)的相关文章

hdu 4585 Shaolin两种方法(暴力和STL)

转载请注明出处: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 mast

MyBatis无限级分类实现的两种方法--自关联与map集合

1.这回先创建数据库吧 下表cid是CategoryId的缩写,cname是CategoryName的缩写,pid是parentId的缩写 无限级分类一般都包含这三个属性,至少也要包含cid和pid才能建立无限级关联 ok,这个东东就是无限级分类了. 即便是外行人稍微看一眼也能发现cid为1的图书在小说和周刊两行中作为了pid,也就是说小说和周刊的父级分类就是图书 图书和饮料的pid是0,代表他们是顶级分类 如果没有其他约束条件,这张表几乎可以无限向下级延伸,是一个树形结构,这里就不写什么数学公

HDU 1013 Digital Roots(两种方法,求数字根)

Digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 67949    Accepted Submission(s): 21237 Problem Description The digital root of a positive integer is found by summing the digits of

两种方法求丑数

我们把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 方法1 : 暴力破解,逐个判断 代码: <pre name="code" class="cpp">#include <iostream> #include <vector> using namespace std; //判断是否是丑数 bool isUgly(int index){ while(index % 2

hdu2844 &amp; poj1742 Coin ---多重背包--两种方法

题意:你有N种硬币,每种价值A[i],每种数量C[i],问.在不超过M的情况下,我们用这些硬币,付款有多少种情况.也就是:1,2,3,4,5,....,M这么多种情况下,你能用你的硬币不找钱,付款多少种情况. 例如: 你有一种硬币,价值2,个数2,那么 你是不能付款 3元的..你只能付款2,或者4元.. OK,题意差不多就是这样啦. 那么这里有两种方式! 分析: 那么这里我们可以用多重背包来解决,我们把价值和重量看成一样的w[i] = A[i]:用M作为背包.那么dp 过后,我们就可以知道 dp

一、查看Linux内核版本命令(两种方法):

一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [[email protected]CentOS home]# cat /proc/versionLinux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 2.uname -a [

利用颜色和形态学两种方法进行车牌区域提取的OpenCV代码

要想提取车牌号,首先你要定位车牌区域嘛,本文分别两种方法用,即颜色和形态学的方法,对车牌区域进行判定.说得是两种方法,其实两种方法并无多大的区别,只是有一步的判断标准不一样而已,你看了下面整理出的的思路就知道两者的区别真的很小了. 方法一:利用颜色提取车牌区域的思路: ①求得原图像的sobel边缘sobelMat ②在HSV空间内利用车牌颜色阈值对图像进行二值化处理,得到图像bw_blue→ ③由下面的判别标准得到图像bw_blue_edge for (int k = 1; k != heigh

ios图片拉伸两种方法

ios图片拉伸两种方法 UIImage *image = [UIImage imageNamed:@"qq"]; 第一种: // 左端盖宽度 NSInteger leftCapWidth = image.size.width * 0.5f; // 顶端盖高度 NSInteger topCapHeight = image.size.height * 0.5f; // 重新赋值 image = [image stretchableImageWithLeftCapWidth:leftCapW

Android第五期 - 更新自己的apk本地与网络两种方法

首先是本地: ParseXmlService部分: package com.szy.update; import java.io.InputStream; import java.util.HashMap; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element