[洛谷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个(如有重复的要输出多个). ...
随机推荐
- FireDAC 连接Access (accdb)数据库
FireDAC可以方便连接数据库,但是要连接新版本的accdb数据库,要注意这样的事项(以Office2010版为例) 安装Office2010 x86版,注意,不能安装x64版,因为Delphi I ...
- [Windows]_[C/C++]_[如何调试子进程]
场景 1.VC++ 的程序A在启动程序C时, 如果需要调试程序C的话一般有两种, 一种是通过菜单 调试->附加到进程的方式来调试程序, 缺点就是这个进程必须先启动, 但是一启动的话有可能就执行了 ...
- 常见bug解析-移动端
手机测试常见bug解析 1.测试时遇到“手机无响应”? 有以下几个原因: a.手机内存不足 b.android进程之间死锁引起的(就是两个进程之间) c.手机的CPU运行高引起的 可以查看手机的崩溃日 ...
- linux常用命令补充详细
1.ls命令 就是list的缩写,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录.文件夹.文件权限)查看目录信息等等 常用参数搭配: ls -a 列出目录所有文 ...
- Halcon环境搭建
1.Visual Studio 2017安装教程 2.Qt5.9安装教程 3.VS2017中Qt插件安装教程
- const char and static const char
部分内容摘自:https://blog.csdn.net/ranhui_xia/article/details/32696669 The version with const char * will ...
- Python 学习笔记之—— PIL 库
PIL,全称 Python Imaging Library,是 Python 平台一个功能非常强大而且简单易用的图像处理库.但是,由于 PIL 仅支持到Python 2.7,加上年久失修,于是一群志愿 ...
- mingw编译opencv2.4.13问题记录
为了在程序中用regex,升级了我的mingw,结果官网上的GCC版本都到6.3了,之前一直用4.8.换了编译器以后,对opencv2.4.10的引用就出了问题:undefined reference ...
- 使用ZSetOperations(有序)操作redis
方法 c参数 s说明 Boolean add(K key, V value, double score); K key:集合key V value:key对应的值 double score:分数 向 ...
- 软工实践Beta冲刺(5/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...