1301 邻值查找 0x10「基本数据结构」例题

描述

给定一个长度为 n 的序列 A,A 中的数各不相同。对于 A 中的每一个数 A_i,求:
min(1≤j<i) ⁡|A_i-A_j|
以及令上式取到最小值的 j(记为 P_i)。若最小值点不唯一,则选择使 A_j 较小的那个

输入格式

第一行一个整数n,第二行n个数A_1~A_n。

输出格式

n-1行,每行2个用空格隔开的整数。分别表示当i取2~n时,对应的 min(1≤j<i) ⁡|A_i-A_j| 和 P_i 的值。

样例输入

3
1 5 3

样例输出

4 1
2 1

数据范围与约定

  • 对于30%的数据: n<=100
  • 对于70%的数据: n<=10^4
  • 对于100%的数据: n<=10^5, |A_i|<=10^9

思路:

用set或者是链表实现

读入第i个时,加入set,set中存的就是i之前的所有数,而且set是默认排好序的。

然后find找到i的位置,|Aj-Ai|最小的一定是Ai的前驱或者后继。

判断一下就行了。要注意Ai就是set的头或尾的情况。

奇怪的是,用printf输出的时候有一点问题不知道是为什么,用cout就行。

 // ConsoleApplication2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// //#include "pch.h"
#include <iostream>
#include <set>
#include <cmath>
#include <stdio.h>
using namespace std; int n;
const int maxn = 1e5 + ;
struct node {
int a;
int id;
bool operator < (const node &b)const {
return a < b.a;
}
}A[maxn];
set<node>sss;
set<node>::iterator after;
set<node>::iterator before; int main()
{
scanf("%d", &n);
scanf("%d", &A[].a);A[].id = ;
sss.clear();
sss.insert(A[]);
for (int i = ; i <= n; i++) {
scanf("%d", &A[i].a);
A[i].id = i;
sss.insert(A[i]);
after = sss.find(A[i]);
before = sss.find(A[i]);
//cout<<(*after).id<<endl;
if (after == sss.begin()) {
after++;
cout<<abs((*after).a - A[i].a)<<" "<<(*after).id<<endl;
//printf("%d %d\n", abs((*after).a - A[i].a), (*after).id);
}
else if (after++, after == sss.end()) {
before--;
//node tmp = *before;
//printf("%d\n", tmp.a);
cout<<abs((*before).a - A[i].a)<<" "<<(*before).id<<endl;
//printf("%d %d\n", abs((*before).a - A[i].a), (*before).id);
}
else {
before--;
if (abs((*before).a - A[i].a) < abs((*after).a - A[i].a)) {
cout<<abs((*before).a - A[i].a)<<" "<<(*before).id<<endl;
}
else if(abs((*before).a - A[i].a) > abs((*after).a - A[i].a)){
cout<<abs((*after).a - A[i].a)<<" "<<(*after).id<<endl;
}
else {
if ((*before).a < (*after).a) {
cout<<abs((*before).a - A[i].a)<<" "<<(*before).id<<endl;
}
else {
cout<<abs((*after).a - A[i].a)<<" "<<(*after).id<<endl;
}
}
}
}
}

CH1301 邻值查找【set应用】的更多相关文章

  1. 【题解】邻值查找 [CH1301]

    [题解]邻值查找 [CH1301] 传送门:邻值查找 \([CH1301]\) \([AcWing136]\) [题目描述] 给定一个长度为 \(n\) 的序列 \(A\),\(A\) 中的数各不相同 ...

  2. 0x13链表与邻接表之邻值查找

    题目链接:https://www.acwing.com/problem/content/138/ 参考链接:https://blog.csdn.net/sdz20172133/article/deta ...

  3. 1301 邻值查找(set 平衡树 | 链表)

    描述 给定一个长度为 n 的序列 A,A 中的数各不相同.对于 A 中的每一个数 A_i,求: min(1≤j<i) ⁡|A_i-A_j| 以及令上式取到最小值的 j(记为 P_i).若最小值点 ...

  4. map按value值查找——find_if的使用(转载)

    转载:http://www.cnblogs.com/xufeiyang/archive/2012/05/09/2491871.html CValueFind #ifndef _CVALUEFIND_H ...

  5. 【数据结构】 顺序表查找(折半查找&&差值查找)

    #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXSIZE 10 首先构造一个 ...

  6. 查找算法(3)--Interpolation search--插值查找

    1. 插值查找 (1)说明 在介绍插值查找之前,首先考虑一个新问题,为什么上述算法一定要是折半,而不是折四分之一或者折更多呢? 打个比方,在英文字典里面查“apple”,你下意识翻开字典是翻前面的书页 ...

  7. PHP 根据值查找键名

    array_search (PHP 4 >= 4.0.5, PHP 5) mixed array_search ( mixed $needle , array $haystack [, bool ...

  8. Java枚举-通过值查找对应的枚举

    一.背景 Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. 最近工作中,对接了很多其他的系统,发现对接的同一个系统 ...

  9. C#算法设计查找篇之03-插值查找

    插值查找(Interpolation Search) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/701 访问. 插值 ...

随机推荐

  1. Java回调方法的设计思路

    package com.test; /** * 回调方法的设计技巧,例如hibernate的getHibernateTemplate().execute(Handler h)方法 */ public ...

  2. MySQL 若干操作

    复制表结构+复制表数据 mysql> create table t3 like t1; mysql> insert into t3 select * from t1; mysql索引 1. ...

  3. strusts annotation

    也叫Zero Configuration(零配置),它省去了写xml文件的麻烦,可以直接在类叫进行配置,不用在java文件和xml文件中来回切换. 1.Action级的注解 @ParentPackag ...

  4. MathType公式保存后为什么字体会变化

    在使用MathType数学公式编辑器的时候,很多的用户朋友是新手会遇到一些问题,比如,有时我们保存后却发现MathType公式字体变化了,原本的斜体变成了正体,面对这种问题我们该如何解决呢?下面就来给 ...

  5. ASP.NET的用户控件

    本文介绍如何在ASP.NET中创建用户控件,控件属性的动态修改以及控件的事件出发机制. 简介ASP.NET的服务端控件使得Web开发工作变得更为简单,功能更为强大.我们介绍过如何在ASP.NET页面中 ...

  6. 数据挖掘Apriori算法——学习笔记

    关联规则.频繁项集.支持度.置信度 关联规则挖掘: 一起购买的商品 支持度(support) 支持度会随着物品增多而减小.因为是同时购买的比率. 置信度(Confidence) 频繁且强规则,有一定意 ...

  7. VC++:制作一个控件注册的小工具

    在平时的工作中,时常需要注册与反注册ActiveX控件,有时需要判断控件是否已经注册.   所以通过查找资料编写了一个控件注册的小工具,欢迎学习交流,不当之处请多多交流. 先直接上图:   主要代码: ...

  8. 经典 MapReduce框架(MRv1)

    在 MapReduce 框架中,作业执行受两种类型的进程控制: 一个称为 JobTracker 的主要进程,它协调在集群上运行的所有作业,分配要在 TaskTracker 上运行的 map 和 red ...

  9. Python 练习题:计算 MAC 地址

    #!/usr/bin/env python #-*- coding:utf-8 -*- ''' 给一个MAC地址加1 ''' mac = '52:54:00:e6:b2:0a' prefix_mac ...

  10. 实例:用类来写一个 memcached 启动脚本

    [root@localhost ~]$ yum install -y memcached #!/usr/bin/env python #-*- coding:utf-8 -*- import os i ...