ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

邻值查找 题解报告

2019-07-23 20:51:58  阅读:253  来源: 互联网

标签:set num abs ++ 题解 s1 邻值 查找 id


题目传送门

【题目大意】

给定一串长度为$n$的序列$A$,求对于$i\in [2,n]$,$min\{|A_i-A_j|\}(1\le j<i)$以及取得最小值时$j$的值。

【思路分析】

这道题可以用set做,一边插入一边排序,由于整个序列在set中是单调递增的,所以使得差最小的$A_j$在set中一定为$A_i$的前驱或者后继,可以直接用set自带的函数查询。

【代码实现】

 1 #include<bits/stdc++.h>
 2 #define rg register
 3 #define go(i,a,b) for(rg int i=a;i<=b;i++)
 4 using namespace std;
 5 struct node{
 6     int num,id;
 7     bool operator<(const node &t) const {
 8         return num<t.num;
 9     }
10 };
11 set<node> a;
12 int main(){
13     int n,x,y;
14     scanf("%d%d",&n,&x);
15     a.insert({x,1});
16     set<node>::iterator q,t;
17     go(i,2,n){
18         scanf("%d",&y);
19         a.insert({y,i});
20         if(a.size()==2){
21             printf("%d 1\n",abs(x-y));
22             continue;
23         }
24         q=a.find({y,i});
25         if((++q)==a.end()){
26             q--;node z=(*(--q));
27             z.num=abs(y-z.num);
28             printf("%d %d\n",z.num,z.id);
29             continue;
30         }else if((--q)==a.begin()){
31             node z;
32             z.num=abs(y-(*(++q)).num);
33             z.id=(*(q)).id;
34             printf("%d %d\n",z.num,z.id);
35             continue;
36         }
37         node s1,s2;
38         q--;
39         s1.num=(*q).num;
40         s1.id=(*q).id;
41         q++;q++;
42         s2.num=(*q).num;
43         s2.id=(*q).id;
44         if(abs(y-s1.num)<=abs(y-s2.num))
45             printf("%d %d\n",abs(y-s1.num),s1.id);
46         else printf("%d %d\n",abs(y-s2.num),s2.id);
47     }
48     return 0;
49 }
代码戳这里

 

标签:set,num,abs,++,题解,s1,邻值,查找,id
来源: https://www.cnblogs.com/THWZF/p/11234314.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有