| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5840 人关注过本帖, 1 人收藏
标题:沙漠和绿洲
只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
如果能把杨大哥这段代码理解透彻 那么图论那一节应该有了个很好的认识

梅尚程荀
马谭杨奚







                                                       
2012-08-19 23:22
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
我也该睡了  大家晚安

梅尚程荀
马谭杨奚







                                                       
2012-08-19 23:23
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我也利用这个机会好好学学吧。今天晚了,明天研究。

现在的 C 区感觉氛围好正呀,几位版主的功劳是莫大的。
2012-08-19 23:29
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
问题找到了,就是最后答案求交集的问题。

思维不严谨啊,哎。
2012-08-20 01:03
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
AC了,一开始的思路是对的,被我自己优化错了,NND。

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

typedef struct node_struct
{
    int height;
    int signal;
}node;

int SIGNAL = 1;
int result = 0;
int perfect = 0;

void find_result(node *last, int n)
{
    int i;
    for (i=0; i<n; i++)
    if (0==last[i].signal) result++;
}

void find_perfect(int (*scope)[2], int j, int n)
{
    int start = -1, last = 0, i;
    while (last!=n)
    {
        for (i=0; i<j; i++)
        if (scope[i][0]<=start+1&&scope[i][1]>last) last = scope[i][1];
        start = last;
        perfect++;
    }
}

int find_target(node *line, int n)
{
    static int i = 0;
    if (1==n)
    {
        if (0==line[0].signal) return 0;
        else return -1;
    }
    for (; i<n; i++)
    {
        if (0==line[i].signal)
        {
            if (i==0)
            {
                if (line[i].height>=line[i+1].height) return i;
            }
            else if (i==n-1)
            {
                if (line[i].height>=line[i-1].height) return i;
            }
            else if (line[i].height>=line[i-1].height&&line[i].height>=line[i+1].height)
                return i;
        }
    }
    return -1;
}

void find_answer(node *store, int id, int m, int n)
{
    int i = id/n, j = id%n;
    if (store[id].signal == SIGNAL) return;
    store[id].signal = SIGNAL;
    if (i!=m-1&&store[id].height>store[id+n].height) find_answer(store, id+n, m, n);
    if (j!=n-1&&store[id].height>store[id+1].height) find_answer(store, id+1, m, n);
    if (j!=0&&store[id].height>store[id-1].height) find_answer(store, id-1, m, n);
    if (i!=0&&store[id].height>store[id-n].height) find_answer(store, id-n, m, n);
}

int main()
{
    int M, N, i=0, j=0, k=0, t, (*scope)[2], flag=0;
    node *store, *last;
    scanf("%d%d",&M,&N);
    store = (node *)malloc(M*N*sizeof(node));
    scope = (int (*)[2])malloc(sizeof(int)*2*N);
    for (t=M*N,i=0; i<t; i++) store[i].signal = 0,scanf("%d",&store[i].height);
    last = store+(M-1)*N;
    for (i=find_target(store,N); i>=0; i=find_target(store,N))
    {
        find_answer(store,i,M,N);
        for (flag=0,k=0; k<N; k++)
        {
            if (flag==0&&last[k].signal==SIGNAL) flag=1, scope[j][0] = k;
            if (flag==1&&last[k].signal!=SIGNAL) 
            {
                scope[j][1] = k-1;
                break;
            }
            else if (flag==1&&k==N-1)
            scope [j][1] = N-1;
        }
        j++, SIGNAL++;
    }
    find_result(last,N);
    free(store);
    if (result>0)
    {
        printf("%d\n%d\n",0,result);
        return 0;
    }
    find_perfect(scope,j,N-1);
    printf("%d\n%d\n",1,perfect);
    return 0;
}
2012-08-20 10:22
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


这难道说明我的成绩比杨大哥的还优秀?

暗喜中。。。。
2012-08-20 10:32
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,10毫秒是它系统的时间片分配单位,这10毫秒是存在误差的。我第二次提交的代码仅仅是将LEN宏由600改成500,减少多余的空间占用,结果提交时间却多出了10毫秒。你可以再提交一次看看是否还稳定在190毫秒。

10毫秒的差距,算法上没什么差别,差别在代码级的优化上。

不过快了就是快了,你的成绩比我的好。如果有兴趣在这方面PK,我可以优化一下我的代码。

重剑无锋,大巧不工
2012-08-20 12:26
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
回复 57楼 beyondyf
跟你PK我果断虚了…
2012-08-20 12:39
netlin
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:24
帖 子:544
专家分:4308
注 册:2012-4-9
收藏
得分:11 
回复 39楼 demonleer
呵呵 直接赋值 这个有点和题意不相符呢

加上键盘赋值函数了:

#include "stdio.h"
#define LEN  50
int a[LEN][LEN],b[LEN][LEN],d[LEN][LEN];
int r,c,bj=0;
void f6(){
    int i,j;
    printf("\ninput num of row:");
    scanf("%d",&r);
    printf("\ninput num of column:");
    scanf("%d",&c);
    if(r>LEN)r=LEN;if(c>LEN)c=LEN;
    printf("\ninput data:\n");
    for(i=0;i<r;i++)
        for(j=0;j<c;j++){
            scanf("%d",&a[i][j]);
            b[i][j]=0;d[i][j]=0;
        }
}
void f1(int i,int j){
    int k;
    b[i][j]=1;
    for(k=j;k<c-1;k++)
        if(a[i][k]>a[i][k+1]&&b[i][k+1]==0)f1(i,k+1);
        else break;
    for(k=i;k<r-1;k++)
        if(a[k][j]>a[k+1][j]&&b[k+1][j]==0)f1(k+1,j);
        else break;
    for(k=j;k>0;k--)
        if(a[i][k]>a[i][k-1]&&b[i][k-1]==0)f1(i,k-1);
        else break;
    for(k=i;k>0;k--)
        if(a[k][j]>a[k-1][j]&&b[k-1][j]==0)f1(k-1,j);
}
void f2(int k,int n){
    int i,j,m;
    for(i=k;i<c&&bj==0;i++){
        for(j=0;j<c;j++)b[r-1][j]=b[r-1][j]+d[i][j];
        if(n>1)f2(i+1,n-1);
        else{
            for(j=0;j<c;j++)if(b[r-1][j]==0)break;
            if(j==c)bj=1;
        }
        for(j=0;j<c;j++)b[r-1][j]=b[r-1][j]-d[i][j];
    }
}
void f5(){
    int i,j,k;
    for(i=0;i<r;i++)
        for(j=0;j<c;j++)
            b[i][j]=0;
}
void main(){
    int i,j,m=0;
    clrscr();
    f6();
    for(j=0;j<c;j++){
        f1(0,j);
        for(i=0;i<c;i++)d[j][i]=b[r-1][i];
        f5();
    }
    printf("\nout:\n");
    for(j=1;j<=c;j++){
        f2(0,j);
        if(bj==1){
            printf("%d\n%d",1,j);
            break;
        }
    }
    if(j>c){
        for(i=0;i<c;i++){
            b[r-1][i]=0;
            for(j=0;j<c;j++)
                b[r-1][i]=b[r-1][i]+d[j][i];
            if(b[r-1][i]==0)m=m+1;
        }
        printf("%d \n%d",0,m);
    }
}

做自己喜欢的事!
2012-08-20 13:02
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 58楼 demonleer
呵呵,看来我的气场还不错。有竞争进步才快,正当的竞争是一种动力。不过这道题我觉得没什么发掘价值了。

有没有兴趣再召集几个志同道合的兄弟,咱们找个学校的OJ组团刷题去?

很久没玩ACM了,我一直想把某个学校的题全A掉。

重剑无锋,大巧不工
2012-08-20 13:20
快速回复:沙漠和绿洲
数据加载中...
 
   



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

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