bzoj 1119 [POI2009] SLO & bzoj 1697 牛排序 —— 置换+贪心
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1119
https://www.lydsy.com/JudgeOnline/problem.php?id=1697
原序列到目标序列的置换,可以找出一些循环节;
发现如果按顺序把一个循环节换下来,如果长度为 l,则第一个数被算了 l-1 次,其它数都是 1 次;
为了代价最小,还可以利用循环节外面的数,做法就是先把它换进来,然后让它算 l-1 次,再换出去;
贪心地取个 min 即可;原来还想过一开始把数字作为位置,位置作为数字,则代价就算在位置上了,但是这样找出了循环节,似乎不一定是能按顺序换的...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=1e4+,inf=1e5+;
int n,w[xn],t[xn],b[xn],mn,mnn,sta[xn],tot,ans,sum;
bool vis[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
void dfs(int x)
{
sta[++tot]=x; vis[x]=;
mn=min(mn,w[x]); sum+=w[x];
if(!vis[b[x]])dfs(b[x]);
}
int main()
{
n=rd(); mnn=inf;
for(int i=;i<=n;i++)w[i]=t[i]=rd(),mnn=min(mnn,w[i]);
sort(t+,t+n+);
for(int i=,x;i<=n;i++)
{
x=lower_bound(t+,t+n+,w[i])-t;
b[x]=i;
}
for(int i=;i<=n;i++)
{
if(vis[i])continue;
tot=; mn=inf; sum=;
dfs(i); if(tot==)continue;
ans+=min(sum+mn*(tot-),sum+mn+mnn*(tot+));
}
printf("%d\n",ans);
return ;
}
bzoj 1697
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=1e6+;
int n,w[xn],t[xn],a[xn],b[xn],mn,sta[xn],tot,mnn;
ll ans,sum;
bool vis[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
void dfs(int x)
{
sta[++tot]=x; vis[x]=;
mn=min(mn,w[x]); sum+=w[x];
if(!vis[b[x]])dfs(b[x]);
}
int main()
{
n=rd(); mnn=;
for(int i=;i<=n;i++)t[i]=rd(),mnn=min(mnn,t[i]);
for(int i=,x;i<=n;i++)x=rd(),a[x]=i,w[i]=t[x];//
for(int i=,x;i<=n;i++)x=rd(),b[i]=a[x];
for(int i=;i<=n;i++)
{
if(vis[i])continue;
tot=; mn=; sum=;
dfs(i);
ans+=min(sum+(ll)mn*(tot-),sum+mn+(ll)mnn*(tot+));
}
printf("%lld\n",ans);
return ;
}
bzoj 1119
bzoj 1119 [POI2009] SLO & bzoj 1697 牛排序 —— 置换+贪心的更多相关文章
- bzoj 1119 [POI2009]SLO && bzoj 1697 [Usaco2007 Feb]Cow Sorting牛排序——思路(置换)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1119 https://www.lydsy.com/JudgeOnline/problem.p ...
- BZOJ 1119: [POI2009]SLO [置换群]
传送门:现在$POI$上的题洛谷都有了,还要$BZOJ$干什么 和$cow\ sorting$一样,只不过问$a_i \rightarrow b_i$ 注意置换是位置而不是数值...也就是说要$i$的 ...
- BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换+贪心)
题面 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都 ...
- 【BZOJ 1119】 1119: [POI2009]SLO (置换)
1119: [POI2009]SLO Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次 ...
- BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心
BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行 ...
- 【BZOJ】1119: [POI2009]SLO
题意 长度为\(n(1 \le n \le 1000000)\)的账单,\(+\)表示存1,\(-\)表示取1,任意时刻存款不会为负.初始有\(p\),最终有\(q\).每一次可以耗时\(x\)将某位 ...
- [BZOJ1697][USACO2007 FEB]Cow Sorting牛排序:贪心+置换
分析 一个月前做的一道题补一下题解,就简单写一写吧. 单独考虑每一个循环节,如果只进行内部的调整,最优方案显然是把最小的绕这个循环交换一圈. 但是借助全局最小值可能使答案更优,两种情况取个\(\max ...
- BZOJ1119: [POI2009]SLO
1119: [POI2009]SLO Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 379 Solved: 181[Submit][Status] ...
- 【BZOJ 1697】1697: [Usaco2007 Feb]Cow Sorting牛排序
1697: [Usaco2007 Feb]Cow Sorting牛排序 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大 ...
随机推荐
- 疑问:使用find_elements_by_ios_predicate定位元素组,获取元素的index没有按照顺序
通过ios Appium Inspect查看到的元素信息如下: eList=self.driver.find_elements_by_ios_predicate('type == “XCUIEleme ...
- golang 格式化时间成datetime
Golang或者Beego,总需要往数据库里写datetime时间戳. Golang对时间格式支持并不理想. 先看一个例子: package main import ( "fmt" ...
- sqlite3常用操作命令 和mysql的区别及优缺点
SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念. sqlite3 testdb.db .databases 命令查看数据库列表 create table tbl(name char(1 ...
- WPF DataGrid 获取当前行某列值
[0]是指当前行第1列的单元格位置 注意:DataRowView要求必须引用System.Data命名空间 方法一: DataRowView mySelectedElement = (DataRowV ...
- lumen url重写
打开nginx配置文件vhosts.conf,加上try_files $uri $uri/ /index.php?$query_string; ,如下 location / { index index ...
- Java知识点梳理——读写分离
1.读写分离:可以通过Spring提供的AbstractRoutingDataSource类,重写determineCurrentLookupKey方法,实现动态切换数据源的功能:读写分离可以有效减轻 ...
- php计算数组的维数
function array_dim($arr){ if(!is_array($arr)) return 0; else{ $max1 = 0; foreach($arr as $item1){ $t ...
- 【题解】[CF718C Sasha and Array]
[题解]CF718C Sasha and Array 对于我这种喜欢写结构体封装起来的选手这道题真是太对胃了\(hhh\) 一句话题解:直接开一颗线段树的矩阵然后暴力维护还要卡卡常数 我们来把\(2 ...
- 我的Java开发学习之旅------>Java经典排序算法之希尔排序
一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...
- SpringBoot学习笔记(13):日志框架
SpringBoot学习笔记(13):日志框架——SL4J 快速开始 说明 SpringBoot底层选用SLF4J和LogBack日志框架. SLF4J的使用 SpringBoot的底层依赖关系 1. ...