当前位置: 首页 > news >正文

UVA10570 Meeting with Aliens(枚举/优化)

题目链接


在这里插入图片描述
1.题目大意:输入一个1-n的排列,每次可以交换任意位置的两个数,求最少将排列变成1-n的一个环状序列的交换次数

2.这个题目找不到什么规律的,也就是没有可行的算法解决,那么只能采用暴力解法,枚举每个数字开头的环状序列。简单模拟一下,不难发现每个数对应的环状序列都有两种,而且排列都可以分成两个部分,对于数字k开头的环状序列有以下两种:

  • {k,k+1,…,n} + {1,2,…,k-1}
  • {k,k-1,…,1} + {n,n-1,…,k+1}
    那么我们只需算出每个数字的两种情况即可,时间复杂度O(n2)

3.这里用到了一些函数和技巧,比如观察上面的两个序列,第一个是由k开始一直加一直到越界后再变为1再逐渐加一,第二个是每次减一直到越界变为n再继续减一,那么我们一个函数就能完成两个序列的计算,很巧妙。我自己写了一大堆乱套了。还有就是"memcpy(目标数组,源数组,sizeof 源数组)"——数组赋值的使用

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <cstdio>
#include <string>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define lowbit(x) (x&(-x))
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int Mod=1e9+7;
const int maxn=505;
int n;
int a[maxn],b[maxn],pos[maxn],p[maxn];

int solve(int x,int d){
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(b[i]!=x){
            cnt++;
            b[p[x]]=b[i];
            p[b[i]]=p[x];
            b[i]=x;
            p[x]=i;
        }
        x+=d;
        if(x>n) x=1;
        if(x<=0) x=n;
    }
    return cnt;
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    while(cin>>n && n){
        for(int i=1;i<=n;i++){
            cin>>a[i];
            pos[a[i]]=i;
        }
        int ans=inf;
        for(int i=1;i<=n;i++){
            memcpy(b,a,sizeof a);
            memcpy(p,pos,sizeof pos);
            ans=min(ans,solve(i,-1));
            memcpy(b,a,sizeof a);
            memcpy(p,pos,sizeof pos);
            ans=min(ans,solve(i,1));
        }
        cout<<ans<<endl;
    }
    return 0;
}




相关文章:

  • flash小实验
  • 2019 ICPC Greater New York Region J - Unicycles (规律+递推+矩阵快速幂)
  • WebLogic 9.2中文帮助网站公测中,欢迎大家访问!
  • 2019 ICPC Greater New York Region C - PassTheBuck(概率)
  • Oracle11gR2安装简介
  • 2019 ICPC Greater New York Region I - RationalBase(思维+进制转换)
  • 广告营销的创新
  • Educational Codeforces Round 86 C - Yet Another Counting Problem(规律+前缀和)
  • SQL Server2005重装Performance Monitor Counter Requirement错误解决
  • UVA1616 Caravan Robbers(二分答案+小数化分数)
  • UVA1619 Feel Good(链表+前缀和)
  • Codeforces Round #637 (Div. 2) D. Nastya and Scoreboard(位运算dfs/记忆化搜索)
  • Cocoa应用程序基本运行过程
  • 我们的内心都有伤痕
  • Codeforces Round #638 (Div. 2) B. Phoenix and Beauty (构造)
  • 「面试题」如何实现一个圣杯布局?
  • cookie和session
  • create-react-app做的留言板
  • Debian下无root权限使用Python访问Oracle
  • github指令
  • golang 发送GET和POST示例
  • Java超时控制的实现
  • js面向对象
  • oschina
  • 机器学习中为什么要做归一化normalization
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前端知识点整理(待续)
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • AI算硅基生命吗,为什么?
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​渐进式Web应用PWA的未来
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (算法)求1到1亿间的质数或素数
  • (原)Matlab的svmtrain和svmclassify
  • (转)Linq学习笔记
  • (转)ORM
  • (转)winform之ListView
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core Swagger 过滤部分Api
  • .NET Core 中插件式开发实现
  • .NET Core引入性能分析引导优化
  • .NET delegate 委托 、 Event 事件,接口回调
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件