婚礼上的小杉

本文介绍了一个基于信件特征码和序号的排序挑战,通过算法处理凌乱的信件堆,实现信件按序号递增顺序输出特征码的任务。

题目描述

背景Background
小杉的幻想来到了经典日剧《求婚大作战》的场景里……
他正在婚礼上看幻灯片,一边看着可爱的新娘长泽雅美,一边想,如果能再来一次就好了(-.-干嘛幻想这么郁闷的场景……)。
小杉身为新一代的山下智久,在虔诚地在心里呼喊了几千次以后,妖精终于出现了。
妖精说,我还是可以帮你回到这张照片的过去,让你再来一次,可是你要帮我一个忙。

(若对情节有任何疑问,请观看原剧)

描述Description
原来妖精先生在夏威夷的教堂里住了太久,家里的信件堆积了太多,凌乱不堪,你的工作就是帮他整理信件。
总计N封的信件,每个信件都有自己的特征码和序号。

输入
每组测试数据的
第一行有N个数,分别是不超过N的不重复的正整数,表示N封信件的序号。
第二行也有N个数,分别是有效数字不超过255位的浮点数(没有前导的0且均大于0),表示N封信件的特征码。
信件的序号和特征码按照给出的顺序一一对应。序号与序号间、特征码与特征码间有一个空格,两行均没有多余的空格。
(1<=N<=1000)

输出
对每组数据输出N行
请按照序号递增的顺序输出信件的特征码
每行一个特征码,且特征码的格式应与输入完全一致

输入样例

3 1 2
1.0 21.2 1

输出样例
21.2
1
1.0

说明
注释Hint 很简单的,不要想太多
.
.
.
.
.
分析
我们把所有输入进去,再一分为二处理,注意数组的范围。
.
.
.
.
程序:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
	int n=1;
	string s[2001],a[2001];
	while (cin>>s[n])
	{
		n++;
	}
	n/=2;
	for (int i=1;i<=n;i++)
	{
		int w,l;
		l=s[i].length();
		w=(int)(s[i][0]-'0');
		for (int j=2;j<=l;j++)
			w=w*10+(int)(s[i][j-1]-'0');
		a[w]=s[i+n];
	}
	for (int i=1;i<=n;i++)
		cout<<a[i]<<endl;
	return 0;
}
"二分法 经常有这样的问题,求 x x 最小值的最大值,即求符合条件的值的最大值(或者求 x x 最大值的最小值),这种问题有个解法叫二分答案法。一听,什么,不知道的答案也能二分?嗯没错,关键在于这个答案是可以判断是不是符合条件的。 算法思想 以求最小值的最大值(最小值最大化)为例,尝试一个可能的答案,如果这个答案符合目条件,那么它肯定是“最小”(可行解),但不一定是“最大”(最优解),然后我们换个更大的可能答案,如果也符合条件,那这个新可行解就更优,不断重复即可。怎么找呢?这时就该二分上场了。 二分前提 1. 1. 答案区间上下限确定,即最终答案在哪个范围是容易知道的。 2. 2. 检验某值是否可行是个简单活,即给你个值,你能很容易的判断是不是符合目要求。 3. 3. 可行解满足区间单调性,即若x是可行解,则在答案区间内 x + 1 x+1(也可能是 x − 1 x−1 )也可行。 二分查找就是二分法的一个简单应用,它也符合二分的三个前提条件: 1. 1. 答案区间上下限:就是 1 1 到 n n 2. 2. 容易检验是否是答案:只要直接判断二分到的位置的数是否是要查找的数即可 3. 3. 区间具有单调性:序列已经是排过序的,明显具有单调性 本也要注意实数判断相等的情况 【目部分】 描述 小杉终于进入了天堂。他看到每个人都带着一双隐形翅膀,他也想要。(小杉是怎么看到的?……) 天使告诉小杉,每只翅膀都有长度,两只翅膀的长度之比越接近黄金分割比例,就越完美。 现在天使给了小杉 N N 只翅膀,小杉想挑出一对最完美的。 你可以认为黄金分割比就是 0.6180339887498949 。 输入格式 第一行有一个数 N N ; 第二行有 N N 个不超过 100000 100000 的正整数,表示 N N 只翅膀的长度。 输出格式 输出两个整数,分两行,表示小杉挑选出来的一对翅膀。 注意,比较短的在前,如果有多对翅膀的完美程度一样,请输出最小的一对。 样例 输入数据 1 4 2 3 4 6 输出数据 1 2 3 数据范围 对于 100 % 100% 的数据, 2 ≤ N ≤ 30000 2≤N≤30000 。"用C++写这一,要求和上面的一样,而且要像给婴儿讲课一样讲解代码和做思路
最新发布
07-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值