| 1 2 3 4 5 6 |

| 3 6 5 1 4 2 |

在一个置换下,x1->x2,x2->x3,...,xn->x1,
每一个置换都可以唯一的分解为若干个不交的循环
如上面那个  可以 =>(1,3,5,4)  1的下面是3  ;3的下面是5 一直循环。   (2,6)
一个循环,有两种处理方法:
①用这个循环中最小的元素,依次与相应元素交换,直到该循环内所有元素归位
②用这个循环中最小的元素与所有数中最小的元素交换,然后用所有数中最小的元素依次与相应元素交换,直到该循环内所有元素归位这样(x1,x2,...,xn)就构成了一个循环

思路:(参考北大的群论以及ACM_cxiove

poj 3270

所以先计算出所有数的和sum,然后再在这个基础上选择是和   循环中最小的元素or所有数中最小的元素  交换。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 10100
typedef long long ll;
using namespace std;
int a[N];
int p[N];
int flag[N];
int tot;
struct node
{
int val;
int cnt;
} q[N];
int n;
void dfs(int u)
{
for(int i = 1; i <=n ; i++)
{
if(a[i] == u && !flag[i])
{
flag[i] = 1;
q[tot].val = min(q[tot].val,a[i]);
q[tot].cnt++;
dfs(p[i]);
}
}
} int main()
{
while(scanf("%d",&n)!=EOF)
{
int minx = 0x3f3f3f3f;
memset(flag,0,sizeof(flag));
int sum = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
p[i] = a[i];
sum += a[i];
minx = min(minx,a[i]);
}
sort(p+1,p+1+n);
tot= 0; for(int i = 1; i <= n; i++)
{
if(flag[i]) continue;
q[tot].val = a[i];
q[tot].cnt = 1;
flag[i] = 1;
dfs(p[i]);
tot++;
} for(int i = 0; i < tot; i++)
{
sum += min(q[i].val*(q[i].cnt-2),minx*(q[i].cnt+1)+q[i].val);
}
printf("%d\n",sum);
}
return 0;
}

  

题意:

对于一个长度为n的字符串,有一个数组表示第i个字符放到那个位置。

输入多个字符串,问这样操作k次后的字符串是什么样子

找出循环的最小周期,求余计算

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#define N 205
typedef long long ll;
using namespace std;
int a[N],p[N];
char ans[N],str[N];
int k,n; int fin(int i,int k) //肯能会产生循环,寻找最小周期;并且找出第i个字符会落在的某位
{
int j,t=i+1;
i++;
for(j=1; j<=k; j++)
{
i=a[i];
if(i==t)
{
for(i=t,t=0; t<(k%j); t++) //利用最小周期
i=a[i];
return i;
}
}
return i;
} int main()
{
while(scanf("%d",&n)!=EOF && n)
{
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]); while(scanf("%d",&k) && k)
{
getchar();
gets(ans);
int L = strlen(ans);
if(L < n)
for(int i = L; i < n; i++)
ans[i] = ' ';
for(int i = 0; i < n; i++)
{
//printf("%d ",fin(i,k) - 1);
str[fin(i,k) - 1] = ans[i];
}
for(int i=n-1;; i--)
if(str[i]!=' ')
{
str[i+1]='\0';
break;
}
printf("%s\n",str);
}
printf("\n");
}
return 0;
}

  

poj3270 && poj 1026(置换问题)的更多相关文章

  1. poj 3270 置换

    poj 置换的应用 黑书原题P248 /** 题意: 给定序列, 将其按升序排列, 每次交换的代价是两个数之和, 问代价最小是多少 思路:1.对于同一个循环节之内的,肯定是最小的与别的交换代价最小 2 ...

  2. POJ 1026 Cipher(更换)

                                                                   Cipher Time Limit: 1000MS   Memory Li ...

  3. POJ 1026 Cipher(置换群)

    题目链接 题意 :由n个数字组成的密钥,每个数字都不相同,都在1-n之间,有一份长度小于等于n的信息,要求将信息放到密钥下边,一一对应,信息不足n的时候补空格,然后将位置重新排列,将此过程重复k次,求 ...

  4. poj 1026 Cipher

    置换群就可以搞定!!! 注意下格式就好了…… #include<iostream> #include<stdio.h> #include<algorithm> #i ...

  5. poj 1026(置换群)

    题意:给你一个变换规则,和一个字符串,问经过k次变换后得到的字符串. 思路:开始的时候试图去找它的整个周期,谁知道周期太大了,各种RE,后来在得知此题需要用置换群来优化,第一次接触置换群学习了下! 代 ...

  6. poj 1026

    这题一开始没看清楚 等级差距不超过1 1->2->3 就是错误的,因为3-1==2 ,意思是间接的也不行 其次等级最小是1,最大是n 你要到达1号首领的位置 假设1号等级x,限制m,最大上 ...

  7. poj 3270(置换 循环)

    经典的题目,主要还是考思维,之前在想的时候只想到了在一个循环中,每次都用最小的来交换,结果忽略了一种情况,还可以选所有数中最小的来交换一个循环. Cow Sorting Time Limit: 200 ...

  8. POJ 1026 置换群的k次幂问题

    题目大意: 给定了一组对应关系,经过k次幂后,得到新的对应关系b[i],然后将给定的字符串上的第i位字符放置到b[i]的位置上, 如果字符串长度不足n就用空格补足,这里的是空格,也就是str[i] = ...

  9. [转] POJ数学问题

    转自:http://blog.sina.com.cn/s/blog_6635898a0100magq.html 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合 ...

随机推荐

  1. 基于微信小程序的失物招领系统的Postmortem

    基于微信小程序的失物招领系统的Postmortem 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 对于我们团队要解决的问题和实现的功能在项目开始就 ...

  2. Flask 应用最佳实践

    一个好的应用目录结构可以方便代码的管理和维护,一个好的应用管理维护方式也可以强化程序的可扩展性 应用目录结构 假定我们的应用主目录是"flask-demo",首先我们建议每个应用都 ...

  3. 关于mule中Spring使用中的一个问题

    在mule中连接数据库时,大家通常喜欢使用spring的数据库连接以及bean的配置,但是在使用时会出现一些问题,即bean无法找到,这些,就是需要把bean的id属性改成name属性:可能是因为mu ...

  4. Django-rest-framework源码分析----认证

    一.前言 1.1.安装 两种方式: github pip直接安装 pip install django-rest-framework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,djan ...

  5. Python内置函数(7)——sum

    英文文档: sum(iterable[, start]) Sums start and the items of an iterable from left to right and returns ...

  6. WPF 自定义TextBox带水印控件,可设置圆角

    一.简单设置水印TextBox控件,废话不多说看代码: <TextBox TextWrapping="Wrap" Margin="10" Height=& ...

  7. 写一个vue组件

    写一个vue组件 我下面写的是以.vue结尾的单文件组件的写法,是基于webpack构建的项目.如果还不知道怎么用webpack构建一个vue的工程的,可以移步到vue-cli. 一个完整的vue组件 ...

  8. Netty事件监听和处理(上)

    陪产假结束了,今天又开始正常上班了,正好赶上米粉节活动,又要忙上一阵了,米粉节活动时间为4.03 - 4.10,有不少优惠,感兴趣的可以关注mi.com或小米商城app. 今天给大家送了福利:小爱音箱 ...

  9. Android P专区免费开放 -- 同样的Android,不同的体验

    2018年3月8日,Google推出了Android P Preview版本,并提供官方镜像下载. 为了让广大开发者能够及时了解Android P的新功能特性,提前为您的app进行良好适配,WeTes ...

  10. C# 文件的一些基本操作

    近期程序中经常用到一些文件的操作,现在大致整理一下. 一. 获取文件或文件夹基本信息 1.获取文件信息,组成一个DataTable信息. /// <summary> /// 获取指定目录下 ...