bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)
2017-09-10 19:10
489 查看
1697: [Usaco2007 Feb]Cow Sorting牛排序
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 706 Solved: 413
[Submit][Status][Discuss]
Description
农夫JOHN准备把他的 N(1 <= N <= 10,000)头牛排队以便于行动。因为脾气大的牛有可能会捣乱,JOHN想把牛按脾气的大小排序。每一头牛的脾气都是一个在1到100,000之间的整数并且没有两头牛的脾气值相同。在排序过程中,JOHN 可以交换任意两头牛的位置。因为脾气大的牛不好移动,JOHN需要X+Y秒来交换脾气值为X和Y的两头牛。请帮JOHN计算把所有牛排好序的最短时间。
Input
第1行: 一个数, N。第2~N+1行: 每行一个数,第i+1行是第i头牛的脾气值。
Output
第1行: 一个数,把所有牛排好序的最短时间。Sample Input
32
3
1
Sample Output
7题意:长度为n的序列,通过不停交换两个数使之有序,每次花费为交换的两个数之和,求最小花费
思路:
①将原序列排序找出所有的置换环,例如:
原序列:2 3 4 1 6 5
排序后:1 2 3 4 5 6
这个序列可以找到两个单独的置换环{ {1, 2, 3, 4} {5, 6} }
②假设置换环长度为t,很显然对于每个置换环要移动某个数字(t-1)次才可以让置换环中所有数字有序,所以一定是移动数值最小的那个!但是不一定,因为你可以先将那个最小的数和整个序列中最小的数交换,排完序后再换回来,这样有可能更优,所以对于每个置换环需要判断一下
#include<stdio.h> #include<algorithm> using namespace std; typedef struct Cow { int val; int id; bool operator < (const Cow &b) const { if(val<b.val) return 1; return 0; } }Cow; Cow s[10005]; int flag[10005]; int main(void) { int n, i, now, sum, ans, cnt; scanf("%d", &n); for(i=1;i<=n;i++) { scanf("%d", &s[i].val); s[i].id = i; } sort(s+1, s+n+1); ans = 0; for(i=1;i<=n;i++) { if(flag[i]) continue; now = i; cnt = sum = 0; while(flag[now]==0) { sum += s[now].val; cnt++; flag[now] = 1; now = s[now].id; } sum -= s[i].val; ans += min(s[i].val*(cnt-1)+sum, s[1].val*(cnt-1)+sum+2*(s[1].val+s[i].val)); } printf("%d\n", ans); return 0; }
相关文章推荐
- BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序 置换
- [BZOJ1697][Usaco2007 Feb]Cow Sorting牛排序(置换)
- [bzoj] 1697: [Usaco2007 Feb]Cow Sorting牛排序
- 【BZOJ】1697: [Usaco2007 Feb]Cow Sorting牛排序(置换群)
- BZOJ_1697_[Usaco2007 Feb]Cow Sorting牛排序_贪心
- BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序【置换群】
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序 置换群
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序
- 【置换群】【bzoj 1697】: [Usaco2007 Feb]Cow Sorting牛排序
- BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序
- 【BZOJ 1697】1697: [Usaco2007 Feb]Cow Sorting牛排序
- bzoj1697 [Usaco2007 Feb]Cow Sorting牛排序
- [Usaco2007 Feb] bzoj1697 Cow Sorting牛排序 [置换群]
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序【置换群】
- BZOJ1119[POI2009]SLO && BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序
- BZOJ 1697: [Usaco2007 Feb]Cow Sorting牛排序
- 【BZOJ】1697: [Usaco2007 Feb]Cow Sorting牛排序
- 1697: [Usaco2007 Feb]Cow Sorting牛排序 (置换群)
- 1697: [Usaco2007 Feb]Cow Sorting牛排序