遗产继承

题目描述

彼特爷爷在为百年之后的大计做准备,打算将经营了几代人的银号生意作为遗产,传承给子孙们。他拥有金融大街上 n 个门牌号连续的房子,每个房子都有一个标价 wi(部分相邻的房子标价是一样的),而且整条街的房子标号是一个单调不下降的序列。
现将其中若千个房子分给 m 个子孙,因为继承者们能力各异,所以彼特爷爷做了一个偏心的操作:继承者们会分别得到一个标价,如果一个继承者的标价牌为 x,那他将获得标价为 x 的所有房子(这些房子的门牌号都是连续的)。
机智的继承者们知道,他只需要找到标价相同、门牌号最小的那个房子即可。

输入格式

第一行包含两个整数 n 和 mm ,表示彼特爷爷拥有的 n 个房产和拥有财产继承权的子孙人数 m 。
第二行包含 n 个整数 wi,房子的门牌号为 i 对应价值为 W。
接下来m行,每行一个整数,表示当前子孙拿到的标价牌。

输出格式

共 m 行,每行一个整数,表示该子孙的房产编号。

样例数据

输入样例 #1输出样例 #1
5 3
2 5 8 12 30
5
12
2
2
4
1

样例分析

如上所述。

数据范围

对于 100% 的数据:1≤m≤n≤10^5,1≤wi​≤10^9 。

解题:

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;

int main(){

	int n,m,w[100005]={},lo,hi,mid,ans,k;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&w[i]);
	sort(w+1,w+1+n);
	for(int i=1;i<=m;i++){
		scanf("%d",&k);
		lo=1;
		hi=n;
		while(lo<=hi){
			mid=(lo+hi)/2;
			if(w[mid]>k)hi=mid-1;
			if(w[mid]<k)lo=mid+1;
			if(w[mid]==k){
				ans=mid;
				hi=mid-1;
				break;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值