链接:

https://ac.nowcoder.com/acm/contest/924/H

题意:

农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动。因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序。每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同。在排序过程中,JOHN可以交换任意两头牛的位置。因为脾气大的牛不好移动,JOHN需要X+Y秒来交换脾气值为X和Y的两头牛。

请帮JOHN计算把所有牛排好序的最短时间。

思路:

离散化,置换群。

考虑位置移动会形成一个有向环,将这个环中最小的值挨个与每个值交替,这个环就变成我们需要的顺序了。

也可以将环中的最小值与环外的最小值交换,用环外的最小值代替交换,每个环选择代价最小的交换方式即可。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
const int MAXN = 3e5 + 10;
const int MOD = 1e9 + 7; struct Node
{
int v;
int pos;
bool operator < (const Node& that) const
{
return this->v < that.v;
}
}node[MAXN]; int n, m, k, t; int Pt[MAXN], Po[MAXN];
int A[MAXN], C[MAXN];
int Vis[MAXN]; int main()
{
// freopen("test.in", "r", stdin);
cin >> n;
int mmin = 5e5+10;
for (int i = 1;i <= n;i++)
{
cin >> node[i].v;
node[i].pos = i;
A[i] = node[i].v;
mmin = min(mmin, A[i]);
}
sort(node+1, node+1+n);
int cnt = 1;
C[node[1].pos] = cnt;
for (int i = 2;i <= n;i++)
{
if (node[i].v == node[i-1].v)
C[node[i].pos] = cnt;
else
C[node[i].pos] = ++cnt;
}
LL res = 0;
for (int i = 1;i <= n;i++)
{
if (Vis[i])
continue;
Vis[i] = 1;
if (C[i] == i)
continue;
LL sum = 0;
sum += A[i];
int pos = C[i], tmpmin = A[i];
int num = 1;
while (pos != i)
{
Vis[pos] = 1;
sum += A[pos];
num++;
tmpmin = min(A[pos], tmpmin);
pos = C[pos];
}
LL v1 = 1LL*tmpmin*(num-1)+sum-tmpmin;
LL v2 = 1LL*mmin*(num-1)+sum-tmpmin+2LL*(tmpmin+mmin);
res += min(v1, v2);
}
cout << res << endl; return 0;
}

最新文章

  1. Leetcode 详解(Valid Number)
  2. Sanarus公司的Cassi微创乳房活检设备投入使用
  3. linux后台执行命令&amp;
  4. jquery 左侧展开栏目
  5. java保存获取Web内容的文件
  6. CentOS启动不显示图形界面直接进入命令行模式
  7. zookeeper、solrcloud、rediscluster集群解决方案
  8. 基于Vue.js 2.0 + Vuex打造微信项目
  9. 03_java基础(五)之项目结构搭建
  10. LIS LCS 最长上升子序列 最长公共子序列 ...
  11. c/c++ 某些特殊数的大小
  12. Android画图之抗锯齿 paint 和 Canvas 两种方式
  13. Python全栈开发:list 、tuple以及dict的总结
  14. C#中的参数关键字params
  15. Advanced Simulation Library(ASL)&amp;&amp; An adaptive and distributed-memory parallel implementation of the immersed boundary (IB) method (IBAMR)
  16. Ubuntu 12.04下安装QQ 2012 Beta3
  17. nodejs常用npm包
  18. ACE线程管理机制-并发控制(1)
  19. 巨蟒python全栈开发flask8 MongoDB回顾 前后端分离之H5&amp;pycharm&amp;夜神
  20. openvswitch安装

热门文章

  1. [干货]兼容HTML5的Placeholder属性-更新版v0.10102013
  2. 如何快速批量修改ArcGIS中的图层设置
  3. 查看linux连接进程占用的实时流量 -nethogs
  4. Spring笔记02(3种加载配置文件的方式)
  5. Codeforces Round #394 (Div. 2) 题解
  6. Windows下Anaconda安装 python + tensorflow
  7. Python中日志的格式化输出
  8. Advanced R之编程风格
  9. 设置Android让EditText不自动获取焦点
  10. docker添加阿里云镜像加速器