题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1119

   https://www.lydsy.com/JudgeOnline/problem.php?id=1697

先找到置换的循环节。发现对于同一个循环节里的元素,可以找一个代价最小的元素,用它把所有元素换到位置上。

每次交换一定有一个元素到自己的位置上了(不然不优);最后一次是两个元素都弄好了;所以一共是 ( n-1 ) 次。其中,每个元素贡献一次,剩下的 2*(n-1) - n 次贡献就可以选择代价最小的那个元素了。

还以为这样就是最优的。

然而其实还可以在循环节外面找一个最小的元素来和自己换。这样的话除了第一次把这个外面的元素换进循环里,剩下每一次交换都有一个元素到了它应该在的位置,所以一共是 ( n+1 ) 次。其中,每个元素贡献一次,被换出去的元素贡献两次,换进来(最后又换出去)的元素贡献 2*(n+1)-n-1 次。和上面情况取 min 即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e6+,M=;
int n,w[N],a[N],b[N],tot; ll ans;
bool vis[N];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
ll Mn(ll a,ll b){return a<b?a:b;}
int main()
{
n=rdn(); int tmn=M;
for(int i=;i<=n;i++)w[i]=rdn(),tmn=Mn(tmn,w[i]);
for(int i=;i<=n;i++)a[i]=rdn();
for(int i=;i<=n;i++)b[rdn()]=i;
for(int i=;i<=n;i++)
if(!vis[i])
{
int cr=i,mn=M;ll sm=; tot=;
while(!vis[cr])
{
tot++; vis[cr]=;
mn=Mn(mn,w[a[cr]]); sm+=w[a[cr]];
cr=b[a[cr]];
}
ans+=Mn((ll)mn*(tot-)+sm-mn,(ll)tmn*(tot+)+sm+mn);
}
printf("%lld\n",ans);
return ;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+,M=1e5+;
int n,a[N],b[N],c[M],ans;
bool vis[N];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mn(int a,int b){return a<b?a:b;}
int main()
{
n=rdn(); int tmn=M;
for(int i=;i<=n;i++)a[i]=rdn(),tmn=Mn(tmn,a[i]);
for(int i=;i<=n;i++)b[i]=a[i];
sort(b+,b+n+);
for(int i=;i<=n;i++)c[b[i]]=i;
for(int i=;i<=n;i++)
if(!vis[i])
{
int cr=i,tot=,mn=M,sm=;
while(!vis[cr])
{
tot++; vis[cr]=;
mn=min(mn,a[cr]); sm+=a[cr];
cr=c[a[cr]];
}
ans+=Mn( mn*(tot-)+sm-mn,tmn*(tot+)+sm+mn );
}
printf("%d\n",ans);
return ;
}

bzoj 1119 [POI2009]SLO && bzoj 1697 [Usaco2007 Feb]Cow Sorting牛排序——思路(置换)的更多相关文章

  1. 【BZOJ 1697】1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大 ...

  2. 【BZOJ】1697: [Usaco2007 Feb]Cow Sorting牛排序(置换群)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1697 置换群T_T_T_T_T_T_T 很久以前在黑书和白书都看过,,,但是看不懂... 然后找了本 ...

  3. BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序

    Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都是一个 ...

  4. 【BZOJ】1697: [Usaco2007 Feb]Cow Sorting牛排序

    [算法]数学置换 [题意]给定n个数,要求通过若干次交换两个数的操作得到排序后的状态,每次交换代价为两数之和,求最小代价. [题解] 考虑置换的定义:置换就是把n个数做一个全排列. 从原数组到排序数组 ...

  5. bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序【置换群】

    至今都不知道置换群是个什么东西--题解说什么就是什么.jpg 以下来自hzwer:http://hzwer.com/3905.html #include<iostream> #includ ...

  6. BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换+贪心)

    题面 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动.因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序.每一头牛的脾气都 ...

  7. BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 215[S ...

  8. BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心

    BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心 Description 农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行 ...

  9. BZOJ1119[POI2009]SLO && BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序

    Problem J: [POI2009]SLO Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 622  Solved: 302[Submit][Sta ...

随机推荐

  1. 简单介绍java Enumeration(转)

    Enumeration接口 Enumeration接口本身不是一个数据结构.但是,对其他数据结构非常重要. Enumeration接口定义了从一个数据结构得到连续数据的手段.例如,Enumeratio ...

  2. 关于iOS开发的学习

    关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...

  3. Treflection03_getFields_getField

    1. package reflectionZ; import java.lang.reflect.Constructor; import java.lang.reflect.Field; public ...

  4. Red Hat OpenStack 10的新特性

    这是Red Hat有史以来最好的版本,同时也是第一个长生命周期版本(最长五年支持),这篇文章会介绍为什么这是你私有云最好的礼物. 由于要使用命令行,以前安装OpenStack是很繁重的工作.这个版本提 ...

  5. python下的复杂网络编程包networkx的使用(摘抄)

    原文:http://blog.sciencenet.cn/home.php?mod=space&uid=404069&do=blog&classid=141080&vi ...

  6. Android报错Type Error executing aapt: Return code -1 - HTTP 500

    我的做法是(乱蒙对的) 把menu.xml干掉!,对的你没看错! 当然其他人方案:如下 1.http://stackoverflow.com/questions/10699439/aapt-filin ...

  7. Python 用Redis简单实现分布式爬虫

    Redis通常被认为是一种持久化的存储器关键字-值型存储,可以用于几台机子之间的数据共享平台. 连接数据库 注意:假设现有几台在同一局域网内的机器分别为Master和几个Slaver Master连接 ...

  8. UVALive 4270 Discrete Square Roots

    题目描述: 在已知一个离散平方根的情况下,按照从小到大的顺序输出其他所有的离散平方根. 在模n意义下,非负整数x的离散平方根是满足0<=r<n且r2=x(mod n)的整数r. 解题思路: ...

  9. Chrome浏览器导出数字证书

    1.F12打开开发者工具,选中"Security"面板-->找到"View certificate",点击 2.选中“详细信息”面板-->复制到文件

  10. HBase Cassandra比较

    转自:http://itindex.net/detail/22338-cassandra-hbase-%E8%AE%BE%E8%AE%A1     Cassandra HBase 一致性 Quorum ...