【CodeVS 2845】排序的代价
http://codevs.cn/problem/2845/
好难的题啊qwq
没想到把排好序的数组的第i位和原数组的第i位的值看成一个单射函数,这样这是一个长度为n的置换。
对于置换的其中一个循环,如果长度为1就不用管了,否则循环中每个数至少要交换一次。
这样我们让循环中不是最小的元素只交换一次,循环中最小的元素交换很多次(具体地,循环节长度-1次)就可以做到这个循环的代价最小。
当然这个循环的代价还可能更小,那就是让循环中的最小元素跟整个数列中的最小元素换一下,先让数列中的最小元素代替循环中的最小元素进行交换,最后再换回来就可以了。
重点是贪心思想。
#include<cstdio>
#include<bitset>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1003;
bitset <N> vis;
int n, a[N], H[N], cnt, mn, ret, ans, id[N], tot, casenum = 0;
int main() {
while (~scanf("%d", &n)) {
cnt = ans = 0;
vis.reset();
for (int i = 1; i <= n; ++i) scanf("%d", a + i), H[++cnt] = a[i];
stable_sort(H + 1, H + cnt + 1); mn = H[1];
++cnt;
for (int i = 1; i <= n; ++i) a[i] = lower_bound(H + 1, H + cnt, a[i]) - H;
for (int i = 1; i <= n; ++i)
if (!vis[i]) {
vis[id[tot = 1] = i] = 1;
int tmp = a[i];
while (!vis[tmp]) {
vis[tmp] = 1;
id[++tot] = tmp;
tmp = a[tmp];
}
tmp = 1;
for (int i = 2; i <= tot; ++i)
if (id[i] < id[tmp]) tmp = i;
ret = 0;
for (int i = 1; i <= tot; ++i)
if (i != tmp) ret += H[id[i]];
ret += min(H[id[tmp]] * (tot - 1), ((H[id[tmp]] + mn) << 1) + mn * (tot - 1));
ans += ret;
}
if (ans == 0) break;
printf("Case %d: %d\n", ++casenum, ans);
}
return 0;
}
【CodeVS 2845】排序的代价的更多相关文章
- CodeVS 2845 排序的代价
Description 给你一个数列使他递增,交换两个元素的代价为两个数的和,最小化代价. Sol 置换群+离散化. 使一个数列恢复递增顺序,那么,他和他要到达的位置的数需要交换,这样就形成了一个置换 ...
- [wikioi 2845]排序的代价(置换群)
有一列数,要对其进行排序(升序).排序只能通过交换来实现.每次交换,可以选择这列数中的任意二个,交换他们的位置,并且交换的代价为二个数的和.排序的总代价是排序过程中所有交换代价之和.先要求计算,对于任 ...
- 记忆化搜索 codevs 2241 排序二叉树
codevs 2241 排序二叉树 ★ 输入文件:bstree.in 输出文件:bstree.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 一个边长为n的正三 ...
- codevs 2241 排序二叉树
/* WTF 写了好久了 开始的时候题目读错了 建图建错了 搜索写的也不好 感觉会T 总之 第一次写的很low 贴一下吧 */ #include<iostream> #include< ...
- BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序
1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 387 Solved: 215[S ...
- 深度排序与alpha混合
原文: https://blogs.msdn.microsoft.com/shawnhar/2009/02/18/depth-sorting-alpha-blended-objects/ 翻译:李现民 ...
- 【转载】Alpha混合物体的深度排序
原文:Alpha混合物体的深度排序 先说个题外话, 本来我想解答一下最近Creators Club论坛上经常出现的一个问题, 意外的是在网上竟然找不到什么全面的答案.. 这是个有着复杂答案的简单问题: ...
- 深度排序与alpha混合 【转】
翻译:李现民 最后修改:2012-07-03 原文:Depth sorting alpha blended objects 先说个题外话,本来我想回答在 Creators Club论坛上的一个常见 ...
- 贪心+拓扑排序 AOJ 2456 Usoperanto
题目传送门 题意:给出一条链,比如x连到y,x一定要在y的左边,且代价是这条链经过的点的权值和,问如何排序使得代价最小 分析:类似拓扑排序,先把入度为0的点入队,把指向该点的所有点按照权值排序,保证这 ...
随机推荐
- 大聊Python-----网络编程
什么是Socket? socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递. 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器 ...
- bzoj 1004 burnside 引理+DP
对于burnside引理需要枚举染色,这道题属于burnside的一种简单求解的方法,就是polya,我们可以使每一种置换中的循环节中的元素的颜色都相同,那么这样的话就可以直接DP了,我们可以将m个置 ...
- poj 2000 Gold Coins
题目链接:http://poj.org/problem?id=2000 题目大意:求N天得到多少个金币,第一天得到1个,第二.三天得到2个,第四.五.六天得到3个....以此类推,得到第N天的金币数. ...
- C++之初始化问题
首先,我们应该明确的是在C++中初始化不是赋值,因为初始化是必要的,如果读取了未初始化的值将会导致不明确的行为.初始化指创建变量并且给它赋初值,而赋值则是擦除对象的当前值并用新值代替.C++支持两种初 ...
- python基础===getattr()函数使用方法
getattr(object, name[,default]) 获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选.需要注意的是,如果是返回的对象的方法,返回的 ...
- Python2.7.3 Tkinter Entry(文本框) 说明
Python学习记录--关于Tkinter Entry(文本框)的选项.方法说明,以及一些示例. 属性(Options) background(bg) borderwidth(bd) cursor ...
- centos_7.1.1503_src_4
http://vault.centos.org/7.1.1503/os/Source/SPackages/ libkcompactdisc-4.10.5-3.el7.src.rpm 05-Jul-20 ...
- 如何更新远程主机上的 Linux 内核
如何更新远程主机上的 Linux 内核 http://blog.csdn.net/robertsong2004/article/details/47277121 转载至:http://www.tiny ...
- [New learn]@class和#import的区别使用
1.简介 我们在查看代码的时候经常会发现有些地方使用@class而有些地方使用#import,他们到底有什么区别呢, 本文意图去归纳和总结这两种类引用的是的处理方法和规则. 2.分析 此小节会通过一些 ...
- jQuery通过Ajax向PHP服务端发送请求并返回JSON数据
SON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成.JSON在前后台交互的过程中发挥着相当出色的作用.请接着往下看教 ...