选拔赛整理

选拔赛题的整理

前天选拔赛结束之后,反思了一下E题的做法,赛场上只是有思路,但是不知道怎么写,今天在这里总结了俩种比较实用的方法。本蒻蒟第一次写博客,对排版还不太熟悉,各位大佬凑合看看吧(●ˇ∀ˇ●)

首先

上题目
链接:https://ac.nowcoder.com/acm/contest/9564/E
来源:牛客网

题目描述
蒲煜凡学长跟学妹出来约会了!蒲煜凡学长作为一名标准直男,想要给学妹买一杯奶茶,便问学妹喜欢喝什么样的奶茶,学妹回了两个字
随便!
蒲煜凡学长傻眼了,但作为一名优秀的ACMer,他是不会坐以待毙的,他早早便将学妹喜欢喝的奶茶价格和奶茶店的价格表弄到了手!现在你要根据奶茶价格,判断学妹到底喜欢喝哪一种奶茶,如果有多种奶茶价格都符合要求,输入种类靠前的一种
输入描述:
第一行包含一个整数n,表示有n种奶茶
第二行有n个数字a[i],a[i]表示第i种奶茶价格
第三行包含一个整数Q,表示Q次询问
第四行包含Q个整数x[i],表示学妹喜欢喝的第i杯奶茶的价格,如果没有找到,则输出-1
输出描述:
输出Q行,每行一个整数表示答案
示例1
输入
复制
6
1 2 10 5 3 2
1
3
输出
复制
5
示例2
输入
复制
5
3 1 7 5 8
2
6
7
输出
复制
-1
3
备注:
1 ≤ Q \≤ 1e5, 1 ≤ n ≤ 1e6
奶茶价格都在int范围内~

一.

看到题目后首先想到的是定义一个结构体,里面存入奶茶的价格和编号,再对奶茶进行排序,最后通过二分查找,去找数值,找到就输出奶茶对应的编号,找不到就输出-1;
在里面首先得有一个结构体
定义结构体就不多说啦上代码!

struct mm{
	int jiage;
	int haoma;
}a[1000000];

下一步进行排序,本蒻蒟在这里用的是sort,需要引用一些头文件

#include <algorithm>
using namespace std;

由于sort函数的排序方式为由小到大,如果我们碰到价格相同的奶茶,这时候我们想让他按编号由小到大排序我们应该再定义一个函数,放在sort里面,去自定义sort的排序方式,上代码!

int cmp(mm x,mm y){
	if(x.jiage==y.jiage)
		return x.haoma<y.haoma;//如果价格相等就按号码大小排序
	return x.jiage<y.jiage;//不同就继续按价格排;

}

整体思路大概就是这样啦
上整体代码!

#include <stdio.h>
#include <algorithm>
using namespace std;
struct mm{
	int jiage;
	int haoma;
}a[1000000];
int cmp(mm x,mm y){
	if(x.jiage==y.jiage)
		return x.haoma<y.haoma;
	return x.jiage<y.jiage;

}
int main(){
	int t;
	scanf("%d",&t);
	for(int i=0;i<t;i++){
		scanf("%d",&a[i].jiage);
		a[i].haoma=i+1;
	}
	sort(a,a+t,cmp);
	int x;
	scanf("%d",&x);
	while(x--){
		int y;
		scanf("%d",&y);
		int l=0,r=t-1,mid;
		while(l<r){
			mid=(l+r)>>1;
			if((a[mid].jiage)>=y)r = mid;
			else
				l = mid + 1;
		}
		if(a[l].jiage==y)
		printf("%d\n",a[l].haoma);
		else
			printf("-1\n");

	}
	return 0;
}

二.

再这里呢,还有一种比较巧妙的方法(我也是被xc和jyq大佬的讲解和代码才理解的,在这里由衷感谢)。
就是我们利用一个map来储存将奶茶的价格与序号一一储存起来,这样我们只需要遍历map,看看其中是否出现过我们要找的数字。
关于map的应用需要引用头文件#include <map>
首先我们要定义map

map<int,int>d;

直接上代码

#include <stdio.h>
#include <algorithm>
#include <map>
using namespace std;
int a[1000010];
map<int,int>d;
int main(){
    d.clear();//这里首先对map进行清理
	long long int n;
	scanf("%lld",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
		if(d[a[i]]==0)d[a[i]]=i+1;//如果奶茶的价格没出现过那我们就给他编号为
		//i+1 如果出现过那我们就不储存他
	}
	long long int h,x;
	scanf("%lld",&h);
	while(h--){
		scanf("%lld",&x);
		if(d[x]==0)//从map容器中寻找x,如果编号为0,即map中没有这个元素即输出 -1;
			printf("-1\n");
		else
			printf("%d\n",d[x]);//如果找到了x,那就直接输出他对应的编号;




	}


}

是不是很简单呀!
今天的整理就到这里啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值