poj3270 Cow Sorting 置换群

2024-06-14 09:18
文章标签 cow 置换群 sorting poj3270

本文主要是介绍poj3270 Cow Sorting 置换群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:有一个序列,你需要将通过交换使得序列最后单调增。每次交换的代价为交换的两个数的和,求将序列变成单调增地最小代价

和。

思路:如果有一个序列:8 4 5 3 2 7 ,那么最终的序列为:2 3 4 5 7 8 。如果视作是一个置换群的作用,那么可以写出循环之积:

(8 2 7)(4 3 5)。对于每个循环,每个数都至少被交换一次,所以我们应该用循环中的最小值和每个数交换,设循环数的最小值

为x,循环内所有数的和为sum,循环内有cnt个数,那么代价和为sum + (cnt - 2)*x 。不过我们还可以从n个数中取最小值不妨设为min

可以让min先和x的位置交换,然后用min与循环内的数交换完,此时min的位置必然是x的最终位置,再将x和min的位置交换,代价和

为sum+(cnt + 1)*min+x; 对于每个循环的代价和一定是这两种情况的最小值,最后用ans累加每个循环的最小代价和即可。详见代

码:

// file name: poj3270.cpp //
// author: kereo //
// create time:  2014年09月01日 星期一 15时54分25秒 //
//***********************************//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=10000+100;
const int inf=0x3fffffff;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
int n;
int a[MAXN],vis[MAXN],hash[10*MAXN]; //值映射地址
int main()
{while(~scanf("%d",&n)){memset(vis,0,sizeof(vis));memset(hash,0,sizeof(hash));int Min=inf;for(int i=1;i<=n;i++){scanf("%d",&a[i]);hash[a[i]]=i; Min=min(Min,a[i]);}sort(a+1,a+n+1);ll ans=0;for(int i=1;i<=n;i++) if(!vis[i]){ll sum=0;int res=inf,x=i,cnt=0;while(!vis[x]){cnt++;sum+=a[x]; res=min(res,a[x]);vis[x]=1; x=hash[a[x]];}ans+=sum+min((ll)(cnt-2)*(ll)res,(ll)(cnt+1)*(ll)Min+(ll)res);}cout<<ans<<endl;}return 0;
}


这篇关于poj3270 Cow Sorting 置换群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059997

相关文章

Sorting It All Out POJ(拓扑排序+floyd)

一个就是简单的拓扑排序,一个就是利用floyd判断是否存在环 #include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;#define MAXD 30#define MAX_SIZE 1000vector<int>G[MAXD];int n,m;char L[MAX

[LeetCode] 969. Pancake Sorting

题:https://leetcode.com/problems/pancake-sorting 题目大意 对于数组A,可进行 k-reverse操作,即将 前k个元素翻转,求能使A为升序的 k-reverse 操作顺序。 解题思路 分析k操作,k-reverse操作只会影响 前面的数,不会影响 数组中后面的数,所以思路是逐步将最大元素 放置在合适的位置。 先拷贝 A 为 Abackup,

【POJ】3660 Cow Contest floyd(可以拓扑排序?)

Cow Contest Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6925 Accepted: 3792 Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating i

BFS —— POJ 3278 Catch That Cow

对应POJ题目:点击打开链接 Catch That Cow Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 54686 Accepted: 17096 Description Farmer John has been informed of the location of a fugitive cow

USACO Section 2.3 Cow Pedigrees

题意: N个节点  深度为K  的正则二叉树  求  树有几种形态 思路: 一开始以为是数学题…  看了byvoid的题解才知道是dp… 每棵树由根节点、左子树、右子树构成  由此得状态转移  树=左子树*右子树 节点数和深度是影响答案的属性  所以令dp[i][j]表示i个节点深度在j以内的树的形态数 深度在j以内的树又两个深度在j-1以内的树和一个根节点构成 设左子树k个节

Codeforces 283. B. Cow Program记忆化搜索

output standard output Farmer John has just given the cows a program to play with! The program contains two integer variables, x and y, and performs the following operations on a sequence a1, a2, ..

Sorting (Merge Sort, Rainball Sort, quick select) 总结

Merge k Sorted Lists (这题是用PQ,或者merge sort都可以做,关于第K大的问题,参考: Find Kth 题目类型总结) Sort an Array (重点掌握merge sort和quick sort,因为两者可以演变为,divide conquer, quick select, 参考: Find Kth 题目类型总结) Sort Colors 思路:三指针,i

【POJ3270】【Cow Sorting】

Cow Sorting Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 6411 Accepted: 2488 Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each

【POJ3268】【Silver Cow Party】【反向dij】【sizeof失效】

Silver Cow Party Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 15522 Accepted: 7039 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going

POJ 1985 Cow Marathon(树的直径)

题目链接 题意:给出一棵树,求出这个树的直径 解答:任选一点进行dfs,会找到一个最远点s,在以这个最远点s进行dfs,会找到一个最远点是t,那么s-t就是树的直径。 //#include<bits/stdc++.h>#include<cstdio>#include<algorithm>#include<vector>#include<cstring>using namespace