本题基本思路:先对原序列进行排序,再根据不同情况采用不同算法。

首先差最大的对数最好求:用最小的数的个数 × 最大的数的个数即可。

接着求差最小的对数:

1.当序列中无重复关键字时:可知最小差必然产生在相邻元素中,遍历一遍用map保存最小差的对数即可。

2.当序列中有重复关键字时:首先确定最小差为0,故而对相同序列的个数依次用排列组合的知识求对数即可。

AC代码如下:

 #include <bits/stdc++.h>
using namespace std; vector<int> ivec;
int n, item, mindis, imin, imax, iequ;
map<int, int> imap;
bool flag; int main()
{
while(cin >> n)
{
ivec.clear();//每次读取n之后都要清空ivec
for(int i = ; i < n; ++i)
{
cin >> item;
ivec.push_back(item);
}
stable_sort(ivec.begin(), ivec.end());
mindis = INT_MAX;
int len = ivec.size();
imin = imax = ;
iequ = ;
flag = false;
imap.clear();
for(int i = ; i < len-; ++i)
{
if(ivec[i] > ivec[] && ivec[i-] == ivec[])
imin = i;
if(ivec[i] < ivec[len-] && ivec[i+] == ivec[len-])
imax = len--i;
if(ivec[i] == ivec[i+])
flag = true;
}
if(flag == true)
{
mindis = ;
for(int i = ; i < len-; ++i)
{
if(ivec[i+] == ivec[i])
{
iequ++;
}
else {
if(iequ > )
{
imap[mindis] += iequ*(iequ-)/;
iequ = ;
}
}
}
if(iequ > ) //考虑相同关键字序列在末尾
imap[mindis] += iequ*(iequ-)/;
} else {
for(int i = ; i < len-; ++i)
{
if(abs(ivec[i+]-ivec[i]) <= mindis)//注意是<=
{
mindis = abs(ivec[i+]-ivec[i]);
imap[mindis]++;
}
}
}
cout << imap[mindis] << " " << imin*imax << endl;
} return ;
}
 import java.util.*;

 public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
int [] a = new int[n];
for (int i = 0; i < n; ++i) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
boolean flag = false;
int imin = 0, imax = 0;
for (int i = 0; i < n-1; ++i) {
if(a[i] == a[i+1])
flag = true;
if(a[i] == a[0] && a[i+1] != a[0])
imin = i+1;
if(a[i] != a[n-1] && a[i+1] == a[n-1])
imax = n - 1 - i;
} int mindis = 1000000000; ;
Map<Integer, Integer> map = new TreeMap<>(); if(flag) {
mindis = 0;
int iequ = 1;
for (int i = 0; i < n-1; ++i) {
if(a[i] == a[i+1]) {
iequ++;
} else {
if (map.containsKey(mindis))
map.put(mindis, map.get(mindis)+iequ*(iequ-1)/2);
else
map.put(mindis, iequ*(iequ-1)/2);
iequ = 1;
}
}
if (iequ > 1) {
if (map.containsKey(mindis))
map.put(mindis, map.get(mindis)+iequ*(iequ-1)/2);
else
map.put(mindis, iequ*(iequ-1)/2);
iequ = 1;
}
} else {
for (int i = 0; i < n-1; ++i) {
if (Math.abs(a[i+1]-a[i]) <= mindis) {
mindis = Math.abs(a[i+1]-a[i]);
if (map.containsKey(mindis))
map.put(mindis, map.get(mindis)+1);
else
map.put(mindis, 1);
}
}
}
System.out.println(map.get(mindis) + " " + imin*imax);
}
sc.close();
}
}

这题AC关键是注意细节:每次读取n之后容器、变量的初始化、有重复关键字在序列末尾的情况、无重复关键字时求最小差对数比较符号的选择等。

算法编程题积累(4)——腾讯笔试"有趣的数字“问题的更多相关文章

  1. 算法编程题积累(3)——腾讯笔试"构造回文“问题

    首先理解题意,回文串的特点:倒序后跟原串相同.故而可以将原串看成向一个回文串在任意位置添加任意字符后形成的字符串,也就是说原串中存在一段未必连续的回文序列. 通过分析可以知道AC本题的核心思路:求出回 ...

  2. 算法编程题积累(1)——网易笔试"工程师工作安排“问题

    首先理解题目意思:每个人只能做工作序号表里的一件工作且两个人不能同时做一件工作.AC思路:采用暴力枚举每种可能的分配方案,子问题的解决逐步向上解决了母问题,最终原问题得解. 标程作者:NotDeep( ...

  3. C算法编程题系列

    我的编程开始(C) C算法编程题(一)扑克牌发牌 C算法编程题(二)正螺旋 C算法编程题(三)画表格 C算法编程题(四)上三角 C算法编程题(五)“E”的变换 C算法编程题(六)串的处理 C算法编程题 ...

  4. C算法编程题(七)购物

    前言 上一篇<C算法编程题(六)串的处理> 有些朋友看过我写的这个算法编程题系列,都说你写的不是什么算法,也不是什么C++,大家也给我提出用一些C++特性去实现问题更方便些,在这里谢谢大家 ...

  5. C算法编程题(六)串的处理

    前言 上一篇<C算法编程题(五)“E”的变换> 连续写了几篇有关图形输出的编程题,今天说下有关字符串的处理. 程序描述 在实际的开发工作中,对字符串的处理是最常见的编程任务.本题目即是要求 ...

  6. C算法编程题(五)“E”的变换

    前言 上一篇<C算法编程题(四)上三角> 插几句话,说说最近自己的状态,人家都说程序员经常失眠什么的,但是这几个月来,我从没有失眠过,当然是过了分手那段时期.每天的工作很忙,一个任务接一个 ...

  7. C算法编程题(四)上三角

    前言 上一篇<C算法编程题(三)画表格> 上几篇说的都是根据要求输出一些字符.图案等,今天就再说一个“上三角”,有点类似于第二篇说的正螺旋,输出的字符少了,但是逻辑稍微复杂了点. 程序描述 ...

  8. C算法编程题(三)画表格

    前言 上一篇<C算法编程题(二)正螺旋> 写东西前还是喜欢吐槽点东西,要不然写的真还没意思,一直的想法是在博客园把自己上学和工作时候整理的东西写出来和大家分享,就像前面写的<T-Sq ...

  9. C算法编程题(二)正螺旋

    前言 上一篇<C算法编程题(一)扑克牌发牌> 写东西前总是喜欢吐槽一些东西,还是多啰嗦几句吧,早上看了一篇博文<谈谈外企涨工资那些事>,里面楼主讲到外企公司包含的五类人,其实不 ...

随机推荐

  1. 古剑奇谭三已取消该页导航,B站版本无法登陆

    最近登陆古剑三突然出现这个问题 怎么重开也无法登陆 最后发现是Ie设置问题 解决方法 点中间这个圆形图标打开 小娜 搜索“ie” 点击打开ie之后点右上角的小齿轮 选择“internet选项” 连接- ...

  2. 生成函数(TBC)

    生成函数 生成函数 (Generating Function) 的应用简单来说在于研究未知(通项)数列规律,用这种方法在给出递推式的情况下求出数列的通项. 对于一个数列 aaa,称f(x)=∑i=0n ...

  3. Cocos2d-x 学习笔记(11.1) MoveBy MoveTo

    1. MoveBy MoveTo 两方法都是对node的平移,MoveBy是相对当前位置的移动.MoveTo是By的子类,是移动到世界坐标位置. 1.1 成员变量和create方法 MoveBy的主要 ...

  4. JAVA锁有哪些种类,以及区别

    原文链接:https://www.cnblogs.com/lxmyhappy/p/7380073.html 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内 ...

  5. HDU 6112 今夕何夕 (预处理 枚举)

    中文题意都看的懂啦~ 思路很简单,就是通过前一天推出当天是星期几,直接枚举所有2017-9999年的每一天就好了.ㄟ( ▔, ▔ )ㄏ 代码: #include <cstdio> #def ...

  6. linux使用jq工具解析json

    jq类似一个awk或grep一样的神器,可以方便地在命令行操作json 这里我使用海南万宁的天气接口做演示,地址:http://t.weather.sojson.com/api/weather/cit ...

  7. phpstorm安装步骤是什么?

    phpstorm的安装及其激活教程 1.phpstorm安装步骤: (1)下载地址:http://www.jetbrains.com/phpstorm/ 根据自己电脑的32or64位下载,下载完后就是 ...

  8. python中函数定义与调用顺序问题

    def main(): try: mtd(3) except Exception as e: print("程序出现异常:", e) mtd(3) def mtd(a): if a ...

  9. spring在IoC容器中装配Bean详解

    1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean ...

  10. VMware安装和linux(centos7)系统安装

    下载centos系统ISO镜像 安装linux系统和winsdows安装系统一样,需要系统文件.浏览器访问centos官网进行下载,http://www.centos.org,因为是国外网站所有下载速 ...