USACO 2.1.3 Sorting A Three-Valued Sequence

来源:互联网 发布:神判魔导卡组淘宝 编辑:程序博客网 时间:2024/05/17 23:38
//// sort3.cpp : 定义控制台应用程序的入口点。////*ID: maiyuet1PROG: sort3LANG: C++*///#include "stdafx.h"/*题意求排序所需的最少移动次数,可以先将输入的数字排序,然后得到不同的地方 比如:  2 2 1 3 3 3 2 3 1 1 1 2 2 2 3 3 3 3 用一个组合(a,b)表示应该排序后某个位置应该是a,但之前的是b 则我们得到(1,2), (1,2), (2,1), (2,3), (2,3), (3,2), (3,1) 然后求这些组合能组成的环(优先考虑长度为2的环),结果就是所有环的长度和减去环的个数  (1,2), (2,1) ---长度为2 (1,2), (2,3), (3,1) ---长度为3 (2,3), (3,2) ---长度为2 结果2+3+2-3=4*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;int cnt[4];int n;int sign[4][4];struct Num{int key;int id;}num[2000];int get(int a, int b){if(a+b == 3){return 3;}if(a+b == 4){return 2;}if(a+b == 5){return 1;}}int main(){freopen("sort3.in","r",stdin);freopen("sort3.out","w",stdout);cin>>n;memset(cnt,0,sizeof(cnt));for(int i=1; i<=n; i++){cin>>num[i].id;cnt[num[i].id]++;}for(int i=1; i<=cnt[1]; i++){num[i].key = 1;}for(int i=cnt[1]+1; i<=cnt[1]+cnt[2]; i++){num[i].key = 2;}for(int i=cnt[1]+cnt[2]+1; i<=cnt[3]+cnt[2]+cnt[1]; i++){num[i].key = 3;}memset(sign,0,sizeof(sign));for(int i=1; i<=n; i++){sign[num[i].key][num[i].id]++;}int sum = 0;int ans = 0;for(int i=1; i<=n; i++){int a = num[i].key;int b = num[i].id;int c = get(a,b);if(a == b || sign[a][b] <= 0){continue;}sign[a][b]--;ans++;if(sign[b][a] > 0){sign[b][a]--;sum += 2;}else{sign[b][c]--;sign[c][a]--;sum += 3;}}cout<<sum-ans<<endl;return 0;}

原创粉丝点击