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

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

接着求差最小的对数:

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

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

AC代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. vector<int> ivec;
  5. int n, item, mindis, imin, imax, iequ;
  6. map<int, int> imap;
  7. bool flag;
  8.  
  9. int main()
  10. {
  11. while(cin >> n)
  12. {
  13. ivec.clear();//每次读取n之后都要清空ivec
  14. for(int i = ; i < n; ++i)
  15. {
  16. cin >> item;
  17. ivec.push_back(item);
  18. }
  19. stable_sort(ivec.begin(), ivec.end());
  20. mindis = INT_MAX;
  21. int len = ivec.size();
  22. imin = imax = ;
  23. iequ = ;
  24. flag = false;
  25. imap.clear();
  26. for(int i = ; i < len-; ++i)
  27. {
  28. if(ivec[i] > ivec[] && ivec[i-] == ivec[])
  29. imin = i;
  30. if(ivec[i] < ivec[len-] && ivec[i+] == ivec[len-])
  31. imax = len--i;
  32. if(ivec[i] == ivec[i+])
  33. flag = true;
  34. }
  35. if(flag == true)
  36. {
  37. mindis = ;
  38. for(int i = ; i < len-; ++i)
  39. {
  40. if(ivec[i+] == ivec[i])
  41. {
  42. iequ++;
  43. }
  44. else {
  45. if(iequ > )
  46. {
  47. imap[mindis] += iequ*(iequ-)/;
  48. iequ = ;
  49. }
  50. }
  51. }
  52. if(iequ > ) //考虑相同关键字序列在末尾
  53. imap[mindis] += iequ*(iequ-)/;
  54. } else {
  55. for(int i = ; i < len-; ++i)
  56. {
  57. if(abs(ivec[i+]-ivec[i]) <= mindis)//注意是<=
  58. {
  59. mindis = abs(ivec[i+]-ivec[i]);
  60. imap[mindis]++;
  61. }
  62. }
  63. }
  64. cout << imap[mindis] << " " << imin*imax << endl;
  65. }
  66.  
  67. return ;
  68. }
  1. import java.util.*;
  2.  
  3. public class Main {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. while(sc.hasNext()) {
  7. int n = sc.nextInt();
  8. int [] a = new int[n];
  9. for (int i = 0; i < n; ++i) {
  10. a[i] = sc.nextInt();
  11. }
  12. Arrays.sort(a);
  13. boolean flag = false;
  14. int imin = 0, imax = 0;
  15. for (int i = 0; i < n-1; ++i) {
  16. if(a[i] == a[i+1])
  17. flag = true;
  18. if(a[i] == a[0] && a[i+1] != a[0])
  19. imin = i+1;
  20. if(a[i] != a[n-1] && a[i+1] == a[n-1])
  21. imax = n - 1 - i;
  22. }
  23.  
  24. int mindis = 1000000000; ;
  25. Map<Integer, Integer> map = new TreeMap<>();
  26.  
  27. if(flag) {
  28. mindis = 0;
  29. int iequ = 1;
  30. for (int i = 0; i < n-1; ++i) {
  31. if(a[i] == a[i+1]) {
  32. iequ++;
  33. } else {
  34. if (map.containsKey(mindis))
  35. map.put(mindis, map.get(mindis)+iequ*(iequ-1)/2);
  36. else
  37. map.put(mindis, iequ*(iequ-1)/2);
  38. iequ = 1;
  39. }
  40. }
  41. if (iequ > 1) {
  42. if (map.containsKey(mindis))
  43. map.put(mindis, map.get(mindis)+iequ*(iequ-1)/2);
  44. else
  45. map.put(mindis, iequ*(iequ-1)/2);
  46. iequ = 1;
  47. }
  48. } else {
  49. for (int i = 0; i < n-1; ++i) {
  50. if (Math.abs(a[i+1]-a[i]) <= mindis) {
  51. mindis = Math.abs(a[i+1]-a[i]);
  52. if (map.containsKey(mindis))
  53. map.put(mindis, map.get(mindis)+1);
  54. else
  55. map.put(mindis, 1);
  56. }
  57. }
  58. }
  59. System.out.println(map.get(mindis) + " " + imin*imax);
  60. }
  61. sc.close();
  62. }
  63. }

这题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. OEMCC 13.3 主机agent部署问题排查

    部署安装 具体的安装过程可参考,Alfred Zhao的文章,非常详细,文章是OEMCC13.2的部署过程.OEMCC13.3没有太大差别. https://www.cnblogs.com/jyzha ...

  2. synchronized块中的wait()、nofity()、nofityAll()方法

    前言 在Java并发编程实战,会经常遇到多个线程访问同一个资源的情况,这个时候就需要维护数据的一致性,否则会出现各种数据错误,其中一种同步方式就是利用Synchronized关键字执行锁机制,锁机制是 ...

  3. RE-1 逆向分析基础

    逆向分析基础 0x01-0x0C 本笔记使用汇编指令为x86架构下汇编指令,ARM架构汇编指令不做介绍 0x01. 关于RE 逆向工程(Reverse Engineering RE) 逆向分析方法: ...

  4. Java线程状态和关闭线程的正确姿势

    1.线程状态及切换 Java中的线程有六种状态,使用线程Thread内的枚举类来实现,如下,我对每个状态都进行了一定的解释. public enum State { /** 表示一个线程还没启用(即未 ...

  5. mysql的十二条基本语句

    在 mysql里,所有语句都以分号作为结束标志! 1.连接服务器 Mysql -u username -p passwd 2.当连上服务器后,首先面对的是库,库有1个或多个,因此我们想对表进行操作的话 ...

  6. OpenCV支持Qt用户界面

    在运行opencv程序的时候报下面的错误: ... The library is compiled without QT support in function ... 原因是在使用cmake安装op ...

  7. 原生无缝Banner轮播图

    话不多说,先展示效果图.由于录制工具,稍显卡顿,实际是流畅的.可以看到实现了无缝轮播,鼠标悬停,点击左右上下按钮切换Banner的功能,如图1所示. 图1 原生无缝banner效果展示 以我这个轮播图 ...

  8. HDU 3371 Connect the Cities(并查集+Kruskal)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3371 思路: 这道题很明显是一道最小生成树的题目,有点意思的是,它事先已经让几个点联通了.正是因为它先 ...

  9. python中的__call__函数

    简单实例: class TmpTest: def __init__(self, x, y): self.x = x self.y = y def __call__(self, x, y): self. ...

  10. 配置IIS服务器提供APP文件下载

    [IIS7.IIS7.5] 1)打开IIS服务管理器,左边点到计算机(也可设置特定网站) 2)右边功能项中找到MIME类型,双击打开3)右键“添加”4)扩展名中填写".apk",M ...