选拔赛题的整理
前天选拔赛结束之后,反思了一下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,那就直接输出他对应的编号;
}
}
是不是很简单呀!
今天的整理就到这里啦!