• UVa 10570 Meeting with Aliens (暴力)


    题意:给定一个排列,每次可交换两个数,用最少的次数把它变成一个1~n的环状排列。

    析:暴力题。很容易想到,把所有的情况都算一下,然后再选出次数最少的那一个,也就是说,我们把所有的可能的形成环状排列全算一下,然后选出最少的。

    那么就开一个两倍的数组,然后两遍从1到n,然后每次选 n 个,进行暴力,每找一个不同的,就去找这个位置应该放的,然后交换。注意两次正序和逆序暴力。

    #include <iostream>
    #include <cmath>
    #include <cstdlib>
    #include <set>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    typedef long long LL;
    const int INF = 0x3f3f3f3f;
    const int maxn = 500 + 5;
    int a[maxn], b[maxn<<1], c[maxn], d[maxn<<1];
    
    int main(){
        int n;
        while(scanf("%d", &n) == 1 && n){
            int ans = INF;
            for(int i = 0; i < n; ++i){  scanf("%d", a+i); b[i] = i+1; }
            memcpy(b+n, b, sizeof(int)*n);
            memcpy(c, a, sizeof(a));
    
            for(int k = 0; k < n; ++k){
                int cnt = 0;
                memcpy(a, c, sizeof(a));
    
                for(int i = 0, j = k; i < n && cnt < ans; ++j, ++i){
                    if(a[i] == b[j])  continue;
                    for(int l = i+1; l < n; ++l) if(b[j] == a[l]){
                        a[l] = a[i];
                        a[i] = b[j];
                        break;
                    }
                    ++cnt;
                }
                ans = min(ans, cnt);
            }
    
            for(int i = 0; i < n; ++i)  d[i] = n-i;
            memcpy(d+n, d, sizeof(int)*n);
            for(int k = 0; k < n; ++k){
                int cnt = 0;
                memcpy(a, c, sizeof(a));
                for(int i = 0, j = k; i < n && cnt < ans; ++j, ++i){
                    if(a[i] == d[j])  continue;
                    for(int l = i+1; l < n; ++l) if(d[j] == a[l]){
                        a[l] = a[i];
                        a[i] = d[j];
                        break;
                    }
                    ++cnt;
                }
                ans = min(ans, cnt);
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    

    代码如下:

  • 相关阅读:
    vector向量容器的一些基本操作
    OpenCV鼠标画图例程,鼠标绘制矩形
    网络安全学习笔记--《暗战强人:黑客攻防入门全程图解》
    遗传算法解决TSP问题实现以及与最小生成树的对比
    基于opencv的手写数字字符识别
    最小生成树
    opencv基本图像操作
    使用vs2010 opencv2.4.4编译release版本程序
    【machine translate】deep learning seq2seq
    【DL】物体识别与定位
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5645423.html
Copyright © 2020-2023  润新知