| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2596 人关注过本帖
标题:NKOJ 1144: 洗牌问题
取消只看楼主 加入收藏
crystaljing
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-7-19
收藏
 问题点数:0 回复次数:4 
NKOJ 1144: 洗牌问题

题目:设2n张牌分别标记为1, 2, ..., n, n+1, ..., 2n,初始时这2n张牌按其标号从小到大排列。经一次洗牌后,原来的排列顺序变成n+1, 1, n+2, 2, ..., 2n, n。即前n张牌被放到偶数位置2, 4, ..., 2n,而后n张牌被放到奇数位置1, 3, ..., 2n-1。可以证明对于任何一个自然数n,经过若干次洗牌后可恢复初始状态。现在你的的任务是计算对于给定的n的值(n≤10^5),最少需要经过多少次洗牌可恢复到初始状态。

比如:输入10,则输出 6;

下面是同学写的一个代码,但是超时,谁帮忙看一下怎么才能提高效率.谢了!!

#include<iostream>
using namespace std;

#define max 100001

int Isack(int a[])
{
int k = 1;
for(int i = 1; i <a[0]; i++)
if(a[i] > a[i+1]) k = 0;
return k;
}

int main()
{
int n, m=0,k;
int a[max],b[max];
for(k = 1; k<max ; k++) a[k] = k;
while(cin >> n)
{
m = 0;
a[0] = 2*n;
do
{
for(int i = 0; i < n; i++)
b[2*i+1] = a[n+i+1];
for(int j = 1; j <= n; j++)
b[2*j] =a[j];
m++;
for(k = 1; k <=2*n; k++)
a[k] = b[k];
}while(Isack(a) == 0);
cout<< m << endl;
}

return 0;
}


[此贴子已经被HJin于2007-7-29 5:44:49编辑过]

搜索更多相关主题的帖子: NKOJ 洗牌 排列 任务 自然数 
2007-07-27 17:10
crystaljing
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-7-19
收藏
得分:0 

二楼讲的是那是...........相当的抽象,读都读不懂!! 该问的问题很多,我看一时也问不完..呵呵!!
三楼的方法我试过了.比以前节约了不少时间,但是还是超时.应该还可以改进.


好好享受我的大学生活~~~
2007-07-27 20:10
crystaljing
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-7-19
收藏
得分:0 

谢谢两位了啊!!


好好享受我的大学生活~~~
2007-07-27 20:11
crystaljing
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-7-19
收藏
得分:0 

leeco 你讲的我都不懂啊,能不能在具体点。。。。。。你做出来了但是我就更加了!!


好好享受我的大学生活~~~
2007-07-28 21:08
crystaljing
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-7-19
收藏
得分:0 

各位怎么就这么厉害呢?!光把你们写的程序读懂都很不简单...........
真心谢谢你们!!


好好享受我的大学生活~~~
2007-07-31 16:04
快速回复:NKOJ 1144: 洗牌问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022243 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved