| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 496 人关注过本帖
标题:做了半天,很纠结的~~~
只看楼主 加入收藏
huwengui
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:166
专家分:158
注 册:2011-4-22
结帖率:83.33%
收藏
已结贴  问题点数:10 回复次数:8 
做了半天,很纠结的~~~
1、使用“翻转”操作,将数据从小到大排列,要求输出翻转的次数(每次翻转只能从第一个数据开始,和紧跟后面的若干数据一起翻转)
例输入5(表示有多少个数据)
      1 2 3 4 5
  输出 0
  输入5
      5 1 2 3 4
  输出 2
  输入 6
  8 4 6 7 5 2
  输出 7
2011-04-22 22:17
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
怎么翻的?

   唯实惟新 至诚致志
2011-04-23 00:12
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
这个问题不错,我来想想看
2011-04-23 01:19
Martinwc
Rank: 2
等 级:论坛游民
帖 子:14
专家分:19
注 册:2011-3-20
收藏
得分:0 
什么是“翻转”操作啊?5 1 2 3 4只翻转2次?
2011-04-23 01:22
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:0 
我的理解是,“翻转”应该是一段数据的逆转:
第一次逆转:5 1 2 3 4 ——》 4 3 2 1 5
第二次逆转:4 3 2 1 5 ——》 1 2 3 4 5
2次“翻转”就排好序了。
2011-04-23 07:28
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:5 
程序代码:
#include <stdio.h>
//翻转 a0 到ak
void inv(int a[],int k)
{
    int t,*i,*j;
    for(i=a,j=a+k;i<j;i++,j--)
    {
        t=*i;*i=*j;*j=t;
    }
}

//-----------------
int main (void)
{
    int i,j,a[100],n,count=0,k,ok;

    scanf("%d",&n);
    for(i=0;i<n;i++)scanf("%d",&a[i]);

    for(i=0;i<n;i++)
    {
        ok=1;                    //假设已经排好序了
        k=0;                    //初始最大值的下标
        for(j=1;j<n-i;j++)
        {
            if( ok && a[j-1]>a[j])ok=0;        //检查是否未排好序
            if(a[j]>a[k])k=j;                //求最大值的下标
        }

        if(ok)break;
        else
        {
            if(k!=0){ inv(a,k);count++;    }            // 未排好序且k!=0时: 翻转 a0 到ak, 使得最大值到a0
            inv(a,n-1-i);count++;);                    // 翻转 a0 到an-1-i,使得最大值置于应有的位置,并统计翻转次数
        }
    }
    printf("%d\n",count);
    return 0;
}


[ 本帖最后由 ying8501 于 2011-4-23 09:28 编辑 ]
2011-04-23 09:22
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:5 
我的思路跟 ying8501 一样,但是还没有想明白为什么这么翻转次数最少, ying8501 能不能解释一下

程序代码:
#include<stdio.h>

void flip(int a[], int s, int e) {    // 翻转数组的第 s 至 e 元素
    int tmp;
    for (; s < e; s++, e--) {
        tmp = a[s];
        a[s] = a[e];
        a[e] = tmp;
    }
}

void put_a(int a[], int l) {    // 只是用来显示数组
    int i;
    for (i = 0; i < l; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
}

int main() {
    int i, j, k, c = 0, n, a[100];
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf(" %d", &a[i]);
    }
    for (i = 0; i < n; i++) {
        k = i;
        for (j = i + 1; j < n; j++) {
            if (a[j] < a[i]) {
                k = j;
            }
        }
        if (k > i) {
            flip(a, i, k);
            put_a(a, n);    // 这里用来显示每次翻转后数字的顺序
            c++;
        }
    }
    printf("%d\n", c);
    return 0;
}
2011-04-23 15:01
xjzxylj
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:86
专家分:113
注 册:2011-4-18
收藏
得分:0 
这个问题比较高深,小弟围观

淫一手湿,简单;难的是,淫一被子湿。(富有诗意,此处抄袭)
2011-04-23 15:45
huwengui
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:166
专家分:158
注 册:2011-4-22
收藏
得分:0 
回复 7楼 voidx
你是求翻转次数最少的方法,题目是要求每次从第一个数据开始翻转的,
这样你翻转的次数就当然比他的多了  ,,,不过你的这种思维+方法,很好,  
2011-04-23 16:38
快速回复:做了半天,很纠结的~~~
数据加载中...
 
   



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

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