UVA-1016 Silly Sort

题目大意:给定一个长度为n的序列,每次操作可以交换任意两个数的位置,代价为两个数的和,求最小代价,将序列排成有序的。
首先,显然需要交换的数一定会形成环:

那么对于每一个环,我们有两种选择: 方案1.自己解决自己 ; 方案2.找人来帮助解决。
方案1:用环中的最小值去和其他数交换,代价为 环中数字总和+环中最小值 *(环中数字个数 - 2);
方案2:用整个数列中的最小值去和环中数交换,代价为 环中数字总和+环中最小值 +数列最小值(环中数字个数 + 1)。

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
int n,S,B[1005],P[1005],Fa[1005],Size[1005],Ans;
struct node {int Num,Id;}A[1005];
bool cmp(node x,node y) {return x.Num<y.Num;}
#define gc (p1==p2&&(p2=(p1=buf)+fread(buf,1,65536,stdin),p1==p2)?EOF:*p1++)
char buf[65536],*p1,*p2;
inline int read()
{
char ch;int x(0);
while((ch=gc)<48);
do x=x*10+ch-48;while((ch=gc)>=48);
return x;
}
inline int GetF(int x)
{
if(x==Fa[x]) return x;
return Fa[x]=GetF(Fa[x]);
}
int main()
{
for(register int _=1;;++_)
{
n=read(),Ans=0;if(!n) break;
for(register int i=1;i<=n;++i) B[i]=A[i].Num=read(),A[i].Id=i,Fa[i]=i,Size[i]=1;
sort(A+1,A+n+1,cmp),S=A[1].Num;
for(register int i=1,fx,fy;i<=n;++i)
{
fx=GetF(i),fy=GetF(A[i].Id),P[A[i].Id]=i;
if(fx!=fy) Fa[fy]=fx,Size[fx]+=Size[fy];
}
for(register int i=1,x,y,fa,ans,Min;i<=n;++i)
{
fa=GetF(i);
if(!Size[fa]) continue;
ans=0,Min=1005,x=i,y=Size[fa];
while(Size[fa]) Min=min(Min,B[x]),ans+=B[x],x=P[x],--Size[fa];
Ans+=min(ans+Min+S*(y+1),ans+Min*(y-2));
}
printf("Case %d: %d\n\n",_,Ans);
}
return 0;
}
UVA-1016 Silly Sort的更多相关文章
- UVA 1016 - Silly Sort 置换分解 贪心
Silly Sort Your younger brother has an assignment and needs s ...
- UVA 11462 Age Sort(计数排序法 优化输入输出)
Age Sort You are given the ages (in years) of all people of a country with at least 1 year of age. Y ...
- UVa 11462 Age Sort
解题报告:给若干个居民的年龄排序,年龄的范围在1到100之间,输入的总人数在0到200W.这题要注意的输入的文件约有25MB,而内存限制为2MB,所以如果人数是像200W这样多的话,甚至都不能把它们都 ...
- 开篇,UVA 755 && POJ 1002 487--3279 (Trie + DFS / sort)
博客第一篇写在11月1号,果然die die die die die alone~ 一道不太难的题,白书里被放到排序这一节,半年前用快排A过一次,但是现在做的时候发现可以用字典树加深搜,于是乐呵呵的开 ...
- COGS 1406. 邻居年龄排序[Age Sort,UVa 11462](水题日常)
★ 输入文件:AgeSort.in 输出文件:AgeSort.out 简单对比时间限制:1 s 内存限制:2 MB [题目描述] Mr.Zero(CH)喜闻乐见地得到了一台内存大大增强 ...
- UVA 10881 Piotr's Ants(等效变换 sort结构体排序)
Piotr's AntsTime Limit: 2 seconds Piotr likes playing with ants. He has n of them on a horizontal po ...
- 1016. Phone Bills (25) -vector排序(sort函数)
题目如下: A long-distance telephone company charges its customers by the following rules: Making a long- ...
- UVA 156:Ananagrams (vector+map+sort)
题意:一大堆单词中间有空格隔开,以'#'结束输出,问只出现一次的的单词有哪些(如果两个具有相同的长度,相同的字母也算是相同的,不区分大小写,如:noel和lone属于一个单词出现两次).最后按照字典序 ...
- Flooded! UVA - 815 (sort排序)
错了好多遍,不知道为啥出错,如果有大神发现,请求指点!!! 附错误代码(错的不知道怎么回事): #include<iostream> #include<cstdio> #inc ...
随机推荐
- C# Dapper基本三层架构使用 (四、Web UI层)
三层架构的好处,一套代码无论WinForm还是Web都可以通用,只写前台逻辑就可以了,现在展示Web调用三层的示例 首先在项目中创建一个Web MVC5项目,目前项目目录如下 在Web项目Web.co ...
- JS010. 三元运算符扩展运用(多层判断语句 / 多条表达式)
MDN - 三元运算符 语法 Condition ? exprIfTrue : exprIfFalse 用例: function getFee(isMember) { return(isMember ...
- freeswitch 编译安装后的配置
--------------------FreeSWITCH configuration------------Locations: prefix: /usr/local/freeswitchexec ...
- Linux find命令实例教程 15个find命令用法
除了在一个目录结构下查找文件这种基本的操作,你还可以用find命令实现一些实用的操作,使你的命令行之旅更加简易.本文将介绍15种无论是于新手还是老鸟都非常有用的Linux find命令.首先,在你的h ...
- scrum项目冲刺_day08总结
摘要:今日完成任务. 1.短信服务正在进行 2.注册登录功能基本实现,但缺少短信验证 3.导航在进行 4.搜索功能基本完成 总任务: 一.appUI页面(已完成) 二.首页功能: 1.图像识别功能(已 ...
- ecshop 加入购物车和直接购买同时存在的方法
一.首先将直接购买的链接设置为 <a href="javascript:bool =1;addToCart({$goods.goods_id})"> bool值为1,g ...
- jdbc 数据库连接 长时间空闲 断开连接 ApplicationContext.xml
数据库连接 长时间空闲 断开连接solution: <property name="validationQuery" value="select 1"/& ...
- 《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)
1.简介 尽管有的小伙伴或者童鞋们觉得很简单,不就是关闭退出浏览器,但是宏哥还是把两个方法的区别说一下,不然遇到坑后根本不会想到是这里的问题. 2.源码 本文介绍webdriver中关于浏览器退出操作 ...
- P6563-[SBCOI2020]一直在你身旁【dp,单调队列】
正题 题目链接:https://www.luogu.com.cn/problem/P6563 题目大意 长度为\(n\)的序列\(a_i\),现在有一个随机\([1,n]\)的整数,每次你可以花费\( ...
- 从零开始部署 Yapi(Windows+Nginx)
一.环境准备及安装 本文中是以本地 Windows 作为安装环境,Nginx 做反向代理,亲测验证可用. Yapi 运行需要的环境: Nodejs,MongoDB 安装包都在文档末尾处 1.1 安装 ...