【置换群+贪心】51Nod1125[交换机器的最小代价]题解
来源:互联网 发布:单机游戏编程语言 编辑:程序博客网 时间:2024/05/16 05:10
题目概述
有
解题报告
2017.9.30Update:神tm这是置换群不是强连通分量,我太蒟蒻了现在才知道QAQ。
对于一个位置
每一个置换群中,只要选一个起点,就可以使该置换群归位,根据贪心,我们肯定选最小的作为起点。
这样考虑是没有错的,但是遗漏了一种情况:从别的置换群中拿一个数
从上面两种情况中取最优秀的再全部累加起来就是最优解了。
示例程序
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn=50000,MAXINT=((1<<30)-1)*2+1;int n,Tot,a[maxn+5],ID[maxn+5];int M,SCC[maxn+5],num[maxn+5],MIN[maxn+5];LL ans,sum[maxn+5];bool vis[maxn+5];bool cmp(int A,int B) {return a[A]<a[B];}int main(){ freopen("program.in","r",stdin); freopen("program.out","w",stdout); scanf("%d",&n);M=MAXINT; for (int i=1;i<=n;i++) scanf("%d",&a[ID[i]=i]),M=min(M,a[i]); sort(ID+1,ID+1+n,cmp); for (int i=1;i<=n;i++) if (!vis[i]) { Tot++;MIN[Tot]=MAXINT; for (int x=i;!vis[x];x=ID[x]) { vis[x]=true;SCC[x]=Tot; num[Tot]++;sum[Tot]+=a[x]; MIN[Tot]=min(MIN[Tot],a[x]); } } for (int i=1;i<=Tot;i++) ans+=min((LL)M*num[i]+sum[i]+M+MIN[i],(LL)MIN[i]*(num[i]-2)+sum[i]); return printf("%lld\n",ans),0;}
阅读全文
1 0
- 【置换群+贪心】51Nod1125[交换机器的最小代价]题解
- 51NOD1125交换机器的最小代价(贪心算法)
- 51nod1125 交换机器的最小代价(贪心)
- 【51Nod1125】交换机器的最小代价
- 【置换群】51Nod 1125交换机器的最小代价
- 51nod 1125[交换机器的最小代价]【贪心】
- 51NOD 1125(交换机器最小代价) (贪心) 思想 !思想!
- 51nod 1125 机器交换最小代价(贪心)
- 51 nod 1125 交换机器的最小代价(强连通分量+贪心)
- 51nod 1125 交换机器的最小代价 (贪心 公式)
- 51nod 1125 交换机器的最小代价
- 51nod 1125 交换机器的最小代价
- 51Nod-1125-交换机器的最小代价
- 1125 交换机器的最小代价 51NOD
- 51Nod 1125 交换机器的最小代价
- 1125 交换机器的最小代价
- 51node1476 括号序列的最小代价(贪心)
- [贪心] 51Nod1476 括号序列的最小代价
- eoj 3279 爱狗狗的两个dalao(dfs)
- 用装饰模式优化代码的一个简单例子
- 排序算法-冒泡排序
- char 转 QString
- PHP面向对象深入理解之四(设计模式-观察者模式)
- 【置换群+贪心】51Nod1125[交换机器的最小代价]题解
- 认知,构建个人的知识体系(上)
- 1.简介
- python猜数字,只有3次机会
- ubuntu16.04安装gpu版本的tensorflow
- ngui UIInput输入汉字的那些坑
- 小端格式和大端格式(Little-Endian&Big-Endian)
- 七夕
- UVA