| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4289 人关注过本帖, 4 人收藏
标题:今天的周赛题,真的是听不懂,求教
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
同事吵着玩游戏,晚一点细看。
printf("no change!\n");
printf("be changed!\n");
这些提示信息是你为调试加进去的,还是到OJ提交的代码就有?
如果在提交的代码中忘了删除这些信息肯定会WA的。

重剑无锋,大巧不工
2012-07-23 21:20
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
以下是引用beyondyf在2012-7-23 21:20:24的发言:

同事吵着玩游戏,晚一点细看。
printf("no change!\n");
printf("be changed!\n");
这些提示信息是你为调试加进去的,还是到OJ提交的代码就有?
如果在提交的代码中忘了删除这些信息肯定会WA的。


这是调试的时候输出的好玩的,提交的时候删掉了,依然RUNTIME ERROR
2012-07-23 21:21
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 62楼 demonleer
嗯,那就好。一会儿我就下线玩去了,明天分析你的代码

重剑无锋,大巧不工
2012-07-23 21:27
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
以下是引用beyondyf在2012-7-23 21:27:03的发言:

嗯,那就好。一会儿我就下线玩去了,明天分析你的代码


嗯,我也耐心的再看看,这玩意就跟绣花一样
2012-07-23 21:29
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
唔,鹏大哥的思路短时间我还追寻不了,明天还要早起,晚上回家再仔细看看好了
我也献丑了,也是模拟交换过程,不过要是多一种数字这就不好弄了...

说来杨大哥是不是故意用了1024整数这个梗......
程序代码:
#include <stdio.h>
#define MAX 1000

int main(void)
{
    int i_1 = 0 , i_2 = 0;
    int i, j, iTmp, iSav, iChangeCount=0;
    int arr[MAX];
    scanf("%d",&i);
    iSav = i;
    iTmp = 0;
    while(i--)
    {
        scanf("%d",&arr[iTmp]);
        if(arr[iTmp] == 1)
            i_1++;
        else if(arr[iTmp] == 2)
            i_2++;

        iTmp++;
    }

    /*模拟交换过程*/
    /* 排序1 */
    for(i=0; i<i_1; i++)
    {
        if(arr[i] == 1) //如果本来就是这个位置的则跳过
            continue;
        else if(arr[i] == 3)  //优先到某块交换以减少交换过程
        {
            for(j=i_1+i_2; j<iSav; j++)
            {
                if(arr[j] == 1)
                {
                    iTmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = iTmp;
                    iChangeCount++;
                    break;
                }
            }
            if(arr[i] == 3) //上循环完了还没交换则证明没有应优先交换项目
                for(j=i_1; j<iSav; j++)
                {
                    if(arr[j] == 1)
                    {
                        iTmp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = iTmp;
                        iChangeCount++;
                        break;
                    }
                }
        }
        else
        {
            for(j=i_1; j<iSav; j++)
            {
                if(arr[j] == 1)
                {
                    iTmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = iTmp;
                    iChangeCount++;
                    break;
                }
            }
        }
    }

    /* 排序2 */
    for(i=i_1; i<i_1+i_2; i++)
    {
        if(arr[i] == 2)
            continue;
        else
        {
            for(j=i_1+i_2; j<iSav; j++) //由于之前排好了1所以无需从第一块寻找,直接和“3”块寻找交换
            {
                if(arr[j] == 2)
                {
                    iTmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = iTmp;
                    iChangeCount++;
                    break;
                }
            }
        }
    }

    for(i=0; i<iSav; i++)
        printf("%d  ",arr[i]);
    printf("\n change:%d \n",iChangeCount);
    return 0;
}



[ 本帖最后由 随风飘荡 于 2012-7-24 00:28 编辑 ]
2012-07-24 00:20
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
回复 65楼 随风飘荡
给跪了,RUNTIME ERROR~
2012-07-24 09:33
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
俺来看一下哈。。
2012-07-24 10:15
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
AC了,代码如下:

程序代码:
#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)
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(1003*sizeof(int)))) return;
    for (scanf("%d",&N); i<N; scanf("%d",store+i++));
    for (i=0; i<N; number[*(store+i++)-1]++);
    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<N; i++)  //把 &&i<N这个条件加上就OK,貌似代码里加不了红色
    {
        if(*(store+i)==target1)
        {
            if (i>=position[target1-1] && i<position[target1-1]+number[target1-1])
            {
                t++;
                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++;
                if (j==number[target1-1]-1) break;
            }
        }
    }
    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++;
        }
    }
    printf("%d\n", total);
    free(store);
}

void main()
{
    sort_function();
}


犯2了犯2了!

[ 本帖最后由 demonleer 于 2012-7-24 11:13 编辑 ]
2012-07-24 11:05
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
擦,还加不了红,

修改的是这一句:

for(i=0; number[target1-1]!=0&&i<N; i++)

OK。
2012-07-24 11:07
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
下面的代码可以输出完整的交换步骤:

又丑又长啊,fuck!
程序代码:
#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(1001*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<N; 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,t=0,j=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])
            {
                t++;
                printf("no change!\n");
                printf_store(store,N);
                if (t==number[target2-1]) break;
            }
            else
            {
                while (target2==*(store+position[target2-1]+j)) j++;
                chg = belongto(i);
                for (m=j,flag=0; m<number[target2-1]; m++)
                {
                    if (chg==*(store+position[target2-1]+m))
                    {
                        flag = 1;
                        break;
                    }
                }
                flag<1?(m=j):1;
                *(store+i) = *(store+position[target2-1]+m);
                *(store+position[target2-1]+m) = target2;
                total++;
                printf("be changed!\n");
                printf_store(store,N);
                if (j==number[target2-1]-1) break;
            }
        }
    }
    printf("the result is %d\n", total);
    free(store);
}

void main()
{
    sort_function();
}
2012-07-24 11:30
快速回复:今天的周赛题,真的是听不懂,求教
数据加载中...
 
   



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

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