| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4289 人关注过本帖, 4 人收藏
标题:今天的周赛题,真的是听不懂,求教
只看楼主 加入收藏
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
以下是引用beyondyf在2012-7-23 11:51:56的发言:

呵呵,和兄弟你交流真是太痛快了。连我的变量取名含意都能猜透。因为我是使用矩阵来分析的,计算的是上三角元素和与下三角元素和,所以变量名就取了top和button的意思。我的英语并不是很好,也许取名不太合适,请指正

小曹和我的思维方式很不相同,应该会从另一个角度分析,我也很期待看看他的想法

对了,demonleer兄弟怎么称呼?


哈哈,杨大哥一直都是个爽快的人,我叫施鹏。以后请杨大哥多多指教啊
2012-07-23 12:27
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
英文不行的帮顶下
2012-07-23 13:15
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
我湿了,给跪
不得不说这个太打击人了

想模拟过程结果无限混乱,这是何等的差距……

[ 本帖最后由 随风飘荡 于 2012-7-23 14:43 编辑 ]
2012-07-23 13:55
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
收藏
得分:0 
我分析一下:
对于给定:
2 2 1 3 3 3 2 3 1  
其排序目标是:
1 1 2 2 2 3 3 3 3

其中“不乖”的数有两类,
变大的(ct): <1,2> <1,2> <2,3> <2,3>
变小的(cb): <2,1> <3,2> <3,1>

其实很容易想到 要么ct==cb, 要么|ct-cb|==1;               
也可以发现:ct与cb集合中有很多相对称的地方:                  
ct中有:<1,2> <2,3>                           
对应cb中有:<2,1> <3,2>                       

在交换只要他们相互交换就行了,剩下的仅仅是1,2,3组成的三组数对,  只要交换两次;                     
或者其中的两个1,2;1,3;2,3组成的两组数对,只要交换1次;                    
还有要么没剩下(不交换),不可能剩下一对的……            
这样的话交换的次数就是 max(cb,ct);

上面证明的只是3个数排序,对于更多的数,好像这个理论不太对;

比如 排序:3 1 4 2四个数, 目标:1 2 3 4
cb=ct=2;
= =! 不过我交换两次怎么都排不了啊! = =!


[ 本帖最后由 回首依依 于 2012-7-23 14:28 编辑 ]
2012-07-23 14:16
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
以下是引用随风飘荡在2012-7-22 16:09:35的发言:

D版大大在妹子的贴子上果然活跃无比,电话拿到了没,我也试试去,刚去洗澡,广州好恐怖,要台风了


深圳这边刮个风下个雨,我那脆弱的网络直接断了,哥昨天郁闷了一下午加一晚上!
2012-07-23 16:00
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
以下是引用随风飘荡在2012-7-23 13:55:16的发言:

我湿了,给跪
不得不说这个太打击人了

想模拟过程结果无限混乱,这是何等的差距……


我的代码里倒是有交换的步骤,晚上我贴出来给大家看看,欢迎批评指正
2012-07-23 16:01
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
施鹏好,指教谈不上,相互交流学习吧!

回首依依提到的问题确实存在,呵呵感谢指正。我有时间检查一下到底遗漏了什么,搞清楚这一点也许我真该写一篇论文了呵呵

重剑无锋,大巧不工
2012-07-23 19:13
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
收藏
得分:0 
回复 57楼 beyondyf
真心佩服版主的编程能力,代码写得真漂亮! 以后大家一起交流,互相促进
2012-07-23 19:18
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 58楼 回首依依
呵呵谢了,再次感谢你的指正。我来这里的目的亦是为了发现自己的不足,学习提高。以后多交流!

[ 本帖最后由 beyondyf 于 2012-7-23 19:37 编辑 ]

重剑无锋,大巧不工
2012-07-23 19:33
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
3种数,分成两个目标,先排列较少的那个目标,并且输出了交换步骤,然后统计另外一个目标,得出结果。

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

int number[3];
int position[3];

#define STATE(x,y,z) x>y?(x>z?1:3):(y>z?2:3)
#define SWAP(x,y) do{x^=y;y^=x;x^=y;}while(0)

void printf_store(int *p , int n)
{
    int i = 0;
    while (i<n)
    {
        printf("%d ",*(p+i++));
    }
    printf("\n");
}

int belongto(int i)
{
    if (i<position[1])return 1;
    if (i>=position[2])return 3;
    else return 2;
}

void sort_function()
{
    int N, *store, target1, target2, chg, state;
    int i = 0, j = 0, t = 0, m = 0, flag = 0, total = 0;
    if (NULL==(store=(int *)malloc(1000*sizeof(int)))) return;
    for (scanf("%d",&N); i<N; scanf("%d",store+i++));
    for (i=0; i<N; number[*(store+i++)-1]++);   // learned this skill from BEYONDYF!!
    state = STATE(number[0],number[1],number[2]);
    position[1] = number[0], position[2] = position[1] + number[1];
    target1 = state%3 + 1;
    target2 = target1%3 + 1;
    if (number[target1-1]>number[target2-1]) SWAP(target1,target2);
    for(i=0; number[target1-1]!=0; i++)
    {
        if(*(store+i)==target1)
        {
            if (i>=position[target1-1] && i<position[target1-1]+number[target1-1])
            {
                t++;
                printf("no change!\n");
                printf_store(store,N);
                if (t==number[target1-1]) break;
            }
            else
            {
                while (target1==*(store+position[target1-1]+j)) j++;
                chg = belongto(i);
                for (m=j,flag=0; m<number[target1-1]; m++)
                {
                    if (chg==*(store+position[target1-1]+m))
                    {
                        flag = 1;
                        break;
                    }
                }
                flag<1?(m=j):1;
                *(store+i) = *(store+position[target1-1]+m);
                *(store+position[target1-1]+m) = target1;
                total++;
                printf("be changed!\n");
                printf_store(store,N);
                if (j==number[target1-1]-1) break;
            }
        }
    } //target1 has been stored!
    for (i=0; i<N; i++)
    {
        if (i == position[target1-1]) i += number[target1-1];
        if(i>=N)break;
        if(*(store+i)==target2)
        {
            if (i<position[target2-1]||i>=position[target2-1]+number[target2-1]) total++;
        }
    } // how many target2 were not be the right locality!
    printf("%d\n", total);
    free(store);
}

void main()
{
    sort_function();
}


我自己都跪了,估计这种代码没人愿意看吧。

[ 本帖最后由 demonleer 于 2012-7-24 10:16 编辑 ]
2012-07-23 21:04
快速回复:今天的周赛题,真的是听不懂,求教
数据加载中...
 
   



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

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