分析:首先我们要知道调用swap()函数的次数跟什么有关。可以观察发现在Insertion Sort里,当且仅当a[j](j∈[0,i)) > a[i]时会调用一次swap(),也就是说有多少个a[j](j∈[0,i)) > a[i]成立就会调用多少次swap()(因为a[i]前面的序列都是有序的),这个数目也叫逆序数。所以要使调用swap()的次数最少,就应该要使整个序列的总的逆序数最小。这时,我们可以枚举所有不同的两个位置对换之后的总逆序数来找最小的总逆序数。但枚举的时候我们需要知道a[i]与a[j]对换之后各自的逆序数以及对换之前的逆序数,记为b[i][j]、b[j][i]、b[i][i]、b[j][j]。因为我们对换a[i]和a[j]的行为只会影响到i~j上的元素的逆序数,我们可以用b[i][j]、b[j][i]、b[i][i]、b[j][j]推导出对换之后的总逆序数的增量。只要求出这个最小的增量我们就可以求得最小的总逆序数。

那现在的关键就是比较快的求出数组b的所有元素的值。这个可以在O(n^2)的时间内完成。在n <= 5000的条件下应该还是可以接受的。

这道题花了不少时间,主要原因在于没把推导的公式写得清清楚楚,虽然知道推导公式的方法,但是没有很快的推出正确的公式。

 1 #include <iostream>
 2 #include <queue>
 3 #include <string>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <cstdio>
 7 #include <map>
 8 #include <vector>
 9 using namespace std;
10 int a[5000], b[5000][5000], n;
11 int main(){
12     cin >> n;
13     for (int i = 0; i < n; i++){
14         cin >> a[i];
15     }
16     for (int i = 0; i < n; i++){
17         for (int j = 0; j < n; j++){
18             b[i][j] = -1;
19         }
20     }
21     for (int i = 0; i < n; i++){
22         b[i][0] = 0;
23         for (int j = 0; j < i; j++){
24             if (a[i] < a[j]){
25                 b[i][j + 1] = b[i][j] + 1;
26             }else{
27                 b[i][j + 1] = b[i][j];
28             }
29         }
30         for(int j = i + 1;j < n;j++){
31             if(a[i] < a[j]){
32                 b[i][j] = b[i][j - 1] + 1;
33             }else{
34                 b[i][j] = b[i][j - 1];
35             }
36         }
37     }
38     int ans = 0;
39     map<int,int> m;
40     for (int i = 0; i < n; i++){
41         for (int j = i + 1; j < n; j++){
42             int x = 2 * (b[i][j] - b[i][i] + b[j][i] - b[j][j]) - (a[i] < a[j]?1:0) + (a[i] > a[j]?1:0);
43             m[x]++;
44             ans = min(ans,x);
45         }
46     }
47     int counter = 0;
48     for (int i = 1; i < n; i++){
49         int j = i;
50         while (j > 0 && a[j] < a[j - 1])
51         {
52             swap(a[j], a[j - 1]); // swap elements a[j] and a[j - 1]
53             counter++;
54             j = j - 1;
55         }
56     }
57     cout << counter + ans << " " << m[ans] << endl;
58     return 0;
59 }

转载于:https://www.cnblogs.com/ZShogg/p/3426071.html

CodeForces 362C相关推荐

  1. Codeforces 362C. Insertion Sort

    DP预处理+枚举逆序对 C. Insertion Sort time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  2. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  3. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  4. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  5. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  6. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  7. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  8. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

  9. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

最新文章

  1. servlet生命周期
  2. 算法笔记之回溯法(2)
  3. ROS安装过程和配置过程(可能出现的问题及解决方法)
  4. Buildroot根文件系统构建
  5. php代码审计zhuru,[php 代码审计]Espcms 暴力注入
  6. sql raiserror_SQL Server PRINT和SQL Server RAISERROR语句
  7. python内置模块~shutil
  8. iOS开源项目周报0302
  9. Vue 动画 过渡的类名
  10. 将excel文档转为word文档的方法
  11. 扫雷可以用计算机,接龙扫雷Windows经典游戏原来还有这些用处啊
  12. dorado7.x argument type mismatch
  13. 你能发现什么?又能坚持什么?
  14. html游戏加载不出图片吗,uc浏览器加载不出图片怎么办?uc浏览器加载不出图片的解决方法...
  15. oracle配置安全更新失败,安装Oracle11gR2先决条件检查失败的详细解决处理过程
  16. Matlab中 的@(x)——处理匿名函数
  17. 【krpano】可拖拽相框遮罩
  18. Flask+BootStrap+SQLite+ECharts编写的教学问卷调查系统
  19. 知乎热议: Java, Go和Python那个前景好?
  20. 【Pygame实战】嗷大喵历险记之程序员吸猫指南:真的太上头了~

热门文章

  1. vba excel 开发游戏_为什么要学习VBA?
  2. php sql报错1054 in,sql语句拼接 报错
  3. linux el5 el6 区别,Oracle ACFS Support on Linux詳解
  4. c语言中的tanh函数,tanh()函数,用于C ++中的复数
  5. word在线解密_实用技能 | 5款免费在线转换PDF的网站
  6. matlab如何截取图像的中间部分_利用matlab提取并分割RGB图像中的某一个已知像素值的图像...
  7. linux php 如何停止,如何关闭linux
  8. java+自定义异常类+输入若干成绩 为负数时输出抛出异常_java+自定义异常类+输入若干成绩 为...
  9. 风变编程python小课课件_风变编程Python小课最近很火,大家学完感受如何?
  10. 鼠标事件响应函数之DOWN:画红色的点