c语言最大元素最小元素归位,poj3270 && poj 1026(置换问题)

L3Byb3h5L2h0dHBzL3d3dy5jbmJsb2dzLmNvbS8=.jpg| 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

#include

#include

#include

#include

#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

#include

#include

#include

#include

#include

#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

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;

}

poj 3270 置换

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

POJ 1026 Cipher(更换)

Cipher Time Limit: 1000MS   Memory Li ...

POJ 1026 Cipher(置换群)

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

poj 1026 Cipher

置换群就可以搞定!!! 注意下格式就好了…… #include #include #include #i ...

poj 1026&lpar;置换群&rpar;

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

poj 1026

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

poj 3270&lpar;置换 循环&rpar;

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

POJ 1026 置换群的k次幂问题

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

&lbrack;转&rsqb; POJ数学问题

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

随机推荐

SqlServer游标简介

游标实例:             Declare MyCusror Cursor Scroll For Select * From Master_Goods Order By GoodsID Ope ...

python学习笔记-(十六)python操作mysql

一. mysql安装 1. windows下安装mysql 1.1. 下载源: http://dev.mysql.com/downloads/installer/,请认准对应版本 Windows (x ...

namesilo域名注册教程

一.注册账号 打开http://www.namesilo.com ,我们先去注册一个Namesilo帐号,然后再在Namesilo注册域名!如图: 接下来,就是填写一些简单资料,如图: 然后Names ...

POJ2743Mobile Computing&lbrack;DFS 状态压缩&rsqb;

Mobile Computing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 666   Accepted: 224   ...

Crawling is going on - Alpha版本使用说明

[Crawling is going on - Alpha版本] 使 用 说 明 北京航空航天大学计算机学院 远航1617 小组 产品版本:   Alpha版本 产品名称:Crawling   is ...

项目结队开发---NABC分析(成员)

一.简介 项目名称:校园导航 特点:手机app,简便易用,适合对铁大地形不了解.路痴者使用. 二.NABC分析 N(need):对于新生报到,学生家长参观校园等想要了解校园路线者,本app软件将带给你 ...

linux常见命令的列表

http://www.pixelbeat.org/cmdline_zh_CN.html 命令 描述 • apropos whatis 显示和word相关的命令. 参见线程安全 • man -t man ...

为Angular-UEditor增加工具栏属性

感谢胡大大分享的的开源项目 Angular 的 UEditor 插件 Angular-UEditor 本文只是修改了angular-ueditor.js,加入了对工具栏的定制,方便项目使用 1 (fu ...

getElementByID、getElementsByName、getElementsByTagName实例详解

getElementByID.getElementsByName.getElementsByTagName实例详解 本文通过实例,详细介绍了getElementByID.getElementsByNa ...

JavaScript input框输入实时校验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值