[洛谷P2127] 序列排序
洛谷题目链接:序列排序
题目描述
小C有一个N个数的整数序列,这个序列的中的数两两不同。小C每次可以交换序列中的任意两个数,代价为这两个数之和。小C希望将整个序列升序排序,问小C需要的最小代价是多少?
输入输出格式
输入格式:
第一行,一个整数N。
第二行,N个整数,表示小C的序列。
输出格式:
一行,一个整数,表示小C需要的最小代价。
输入输出样例
输入样例#1:
6
8 4 5 3 2 7
输出样例#1:
34
说明
数据范围:
对于30%的数据,1<=N<=10;
对于全部的数据,1<=N<=100000,输入数据中的其他整数均为正整数且不超过109。
简述一下题意:给出一个长度为n的序列(其中元素权值各不相同),通过多次交换两个元素使得整个序列为升序.每次交换的代价是交换的两个元素的权值,要求出最小的代价.
简单想一下,因为每个权值都不同,那么很显然我们是知道最终状态是怎么样的,那么很显然不论怎么样交换,每个元素都有一个它最终要到的位置.
既然这样,那么我们可以处理出每个元素最终要到的位置,以这样方式交换那么序列中的交换情况就可以看作是几个环.
现在假设有这样一个序列:3 1 2 5 4.它的最优交换方法为swap(1 , 2),swap(1 , 3),swap(4 , 5).1要到第一位,2要到第2位,3要到第3位,很显然1,2,3这三个下标上的数组成了一个交换的环,也就是从一个位置出发一直找该下标元素最终要到的位置,然后再从这个位置出发直到走到一开始出发的那个位置.(我们接下来讲的环都是指这个概念),那么在环上交换的贪心策略很显然是用最小的值与其他值来交换.
那么显然可以得到这样一个贪心:
找到一个交换的环中最小的权值,用它来与在这个环上的其他未归位的元素交换.
但是这样的贪心仍然是有问题的.我们看这样一组数据:
5
1 60 30 40 50
如果只考虑用换上的最小值来交换的话,求出来的答案是240,但是如果先将环上最小值和整个序列上的最小值进行交换,然后用这个最小值来代替之前的最小值来计算,就有可能得到更优解.
于是得到一个优化后的贪心策略:判断是使用当前交换环上最小值来完成交换还是先将环上最小值与整个序列最小值交换得到的结果更优.
然后就是注意一下找环的时候一些边界问题,注意一下细节就没了.
#include<bits/stdc++.h>
using namespace std;
typedef long long lol;
const int N=100000+5;
const int inf=2147483647;
lol n, ans = 0, w[N];
lol len = 0, tot = 0;
lol mn = inf, minn = inf;
struct brick{
lol id, w;
}a[N];
bool cmp(brick a,brick b){
return a.w < b.w;
}
int main(){
cin >> n;
for(lol i=1;i<=n;i++){
cin >> a[i].w;
a[i].id = i; w[i] = a[i].w;
minn = min(minn , a[i].w);
}
sort(a+1 , a+n+1 , cmp);
for(lol i=1;i<=n;i++){
if(a[i].id != i){
lol k = a[i].id; tot = w[i]; len = 1;
a[i].id = i; mn = w[i];
while(k!=i){//找环
len++; mn = min(mn , w[k]);
tot += w[k];
swap(a[k].id , k);
}
if(mn == minn) ans += tot+mn*(len-2);
else ans += min(minn*(len+1)+mn+tot,tot+mn*(len-2));//判断哪种情况更优
}
}
cout << ans << endl;
return 0;
}
[洛谷P2127] 序列排序的更多相关文章
- 洛谷 P2127 序列排序
https://www.luogu.org/problemnew/show/P2127 感觉题解里写的比较复杂,可能自己的想法比较简单一点吧. 看这个图中的的点如果形成一个环,贪心的考虑,要想花费最少 ...
- 洛谷P2127 序列排序 [贪心]
题目传送门 题目描述 小C有一个N个数的整数序列,这个序列的中的数两两不同.小C每次可以交换序列中的任意两个数,代价为这两个数之和.小C希望将整个序列升序排序,问小C需要的最小代价是多少? 输入输出格 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
- 洛谷P4891 序列 || 膜法阵,魔法阵
https://www.luogu.org/problemnew/show/P4891 一道几乎一样的题http://210.33.19.103/contest/1130/problem/3 题面ht ...
- 洛谷P4891 序列(势能线段树)
洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...
- 【洛谷P2127】序列排序
题目大意:给定一个长度为 N 的序列,序列中的数两两不相同,每次可以交换序列中任意两个数,代价为这两个数的和,问将序列调整为升序,最少的代价是多少. 题解:考虑这个问题的一个子问题,这个序列为 N 的 ...
- P2127 序列排序
题目描述 小C有一个N个数的整数序列,这个序列的中的数两两不同.小C每次可以交换序列中的任意两个数,代价为这两个数之和.小C希望将整个序列升序排序,问小C需要的最小代价是多少? 输入输出格式 输入格式 ...
- [UVA1402]Robotic Sort;[SP2059]CERC07S - Robotic Sort([洛谷P3165][CQOI2014]排序机械臂;[洛谷P4402][Cerc2007]robotic sort 机械排序)
题目大意:一串数字,使用如下方式排序: 先找到最小的数的位置$P_1$,将区间$[1,P_1]$反转,再找到第二小的数的位置$P_2$,将区间$[2,P_2]$反转,知道排序完成.输出每次操作的$P_ ...
- 洛谷2085最小函数值(minval) + 洛谷1631序列合并
题目描述 有n个函数,分别为F1,F2,-,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci (x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). ...
随机推荐
- Anytime项目开发记录3
应用想要做的好,反馈必然少不了~哈哈~ 用户的反馈.意见.建议,甚至是谩骂,都是对项目的反馈. 如果一个应用没有听取用户的反馈,那么应用会离着用户越来越远.懂得用户要什么是一回事,听得到用户的反馈,则 ...
- 『Golang』MongoDB在Golang中的使用(mgo包)
有关在Golang中使用mho进行MongoDB操作的最简单的例子.
- selenium 的安装使用
直接pip安装 pip install selenium 默认是火狐浏览器,需要安装下面网址的软件,解压后加入到环境变量中就可以了 https://github.com/mozilla/geckodr ...
- 十分钟掌握pandas中文版(pandas官方文档翻译)
转载自 https://blog.csdn.net/jiangjiang_jian/article/details/80022918
- Python 学习笔记之—— PIL 库
PIL,全称 Python Imaging Library,是 Python 平台一个功能非常强大而且简单易用的图像处理库.但是,由于 PIL 仅支持到Python 2.7,加上年久失修,于是一群志愿 ...
- MongoDB Linux下的安装和启动
1. 下载MongoDB,此处下载的版本是:mongodb-linux-i686-1.8.1.tgz.tar. http://fastdl.mongodb.org/linux/mongodb-linu ...
- linux 进程间通信之pipe
在实际开发过程中,程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标. 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内 ...
- WebKit资源加载和网络栈
webkit笔记,主要来自 朱永盛 <WebKit技术内幕> 学习笔记,转载就注明原著,该书是国内仅有的Webkit内核的书籍,学习的好导师,推荐有兴趣的朋友可以购买 WebKit资源加载 ...
- 利用Github Pages建立仓库“门面”
嘛是Github Pages? Github Pages 是一个静态网站托管服务,用来从你的Github仓库中直接发布 个人.组织或项目的网站页面 Github Pages发布的页面统一使用githu ...
- P4467 [SCOI2007]k短路
题目描述 有 n 个城市和 m 条单向道路,城市编号为 1 到 n .每条道路连接两个不同的城市,且任意两条道路要么起点不同要么终点不同,因此 n 和 m 满足 m \le n(n-1)m≤n(n−1 ...