`

百度之星 2005年 初赛题目二

 
阅读更多

题目描述:请编写程序,找出下面输入数据及格式中所描述的输入数据文件中最大重叠区间的大小。

对一个正整数 n ,如果 n 在数据文件中某行的两个正整数(假设为 A B )之间,即 A<=n<=B A>=n>=B ,则 n 属于该行;如果 n 同时属于行 i j ,则 i j 有重叠区间;重叠区间的大小是同时属于行 i j 的整数个数。
例如,行( 10 20 )和( 12 25 )的重叠区间为 [12 20] ,其大小为 9 ;行( 20 10 )和( 12 18 )的重叠区间为 [10 12] ,其大小为 3 ;行 (20 10) 和( 20 30 )的重叠区间大小为 1

输入数据:程序读入已被命名为 input.txt 的输入数据文本文件,该文件的行数在 1 1,000,000 之间,每行有用一个空格分隔的 2 个正整数,这 2 个正整数的大小次序随机,每个数都在 1 2^32-1 之间。(为便于调试,您可下载测试 input.txt 文件,实际运行时我们会使用不同内容的输入文件。)

输出数据:在标准输出上打印出输入数据文件中最大重叠区间的大小,如果所有行都没有重叠区间,则输出 0

评分标准:程序输出结果必须正确,内存使用必须不超过 256MB ,程序的执行时间越快越好。

 

 

 

l2lib.c

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

struct Node
{
       int LineNum;
       int Begin;
       int End;
       int Len;
       struct Node * Next;
};


struct List
{
     struct Node * Header;
     int Len;
     struct Node * CurPtr;
     int CurPos;
};

void InitList(struct List* list);
void AddList(struct List* list,int linenum,int start,int end);
void FreeList(struct List* list);
void FilterList(struct List* list,int filter); //剔除|end-start|<filter的节点
int GetMaxOverRange(struct List* list,int a,int b);//获取a,b与List节点重叠区域最大的值
void PrintList(struct List* list); //打印列表
int GetLen(struct List* list);

 

 

   l2lib.c

 

#include "l2lib.h"
void InitList(struct List* list)
{
     list->Header=NULL;
     list->Len=0;
     list->CurPtr=NULL;
     list->CurPos=0;
}
void AddList(struct List* list,int linenum,int start,int end)
{
     struct Node* node = (struct Node*)malloc(sizeof(struct Node));
     node->LineNum=linenum;
     node->Begin=start;
     node->End=end;
     node->Len=abs(end-start);

     node->Next=list->Header;
     list->Header=node;
     list->Len++;
}
void FreeList(struct List* list)
{
     struct Node* tmp;
     while(list->Header!=NULL)
     {
        tmp=list->Header;
        list->Header=tmp->Next;
        free(tmp);
        list->Len--;
     }
}
void FilterList(struct List* list,int filter)
{
 	 struct Node* tmp;
 	 struct Node* cur;
 	 while(list->Header!=NULL&&list->Header->Len<filter)
 	 {
		 tmp=list->Header;
		 list->Header=tmp->Next;
		 free(tmp);
		 list->Len--;
	 }
 	 cur=list->Header;
 	 while(cur->Next != NULL)
 	 {
	    tmp=cur->Next;
	    //printf("line:%d\n",cur->LineNum);
	    if((int)((struct Node*)(cur->Next)->Len)<filter)
	    {
	       cur->Next=(struct Node*)(cur->Next)->Next;
	       (int)(list->Len)--;
	       free(tmp);
        }
        else
        {
		 	cur=(struct Node*)(cur->Next);
	 	}
	 }
}

int max(int a,int b)
{
   return a<b?b:a;
}
int min(int a,int b)
{
   return a<b?a:b;
}
int getoverrange(int a1,int a2,int b1,int b2)
{
   int start=min(a1,a2)<min(b1,b2)?min(b1,b2):min(a1,a2);
   int end=max(a1,a2)<max(b1,b2)?max(a1,a2):max(b1,b2);
   int range=end-start+1;
   return range>0?range:0;
}


int GetMaxOverRange(struct List* list,int a,int b)
{
    int curmax=0;
    struct Node* cur;
    cur=list->Header;
    while(cur!=NULL)
    {
        int overrange=getoverrange(a,b,cur->Begin,cur->End) ;
        curmax=overrange<curmax?curmax:overrange;

        cur=cur->Next;
    }
    return curmax;
}

void PrintList(struct List* list)
{
    struct Node* tmp;
    tmp=list->Header;
    while(tmp!=NULL)
    {
        printf("line:%d,start:%d,end:%d,len:%d\n",tmp->LineNum,tmp->Begin,tmp->End,tmp->Len);
        tmp=tmp->Next;
    }
}
int GetLen(struct List* list)
{
 	return list->Len;
}

 

 

  main.c

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include"l2lib.h"
#include<fcntl.h>
#define INPUT "2.input.txt" 
#define BUFSIZE 512
int curmax=0;
char buf[BUFSIZE];//read IO buf
char keepbuf[BUFSIZE*2];//handler buf; keep the string don't meet '\n'
int  keeplen=0; //暂存为处理的字符长度
char record[40];//单行支持的最大程度
int curline=0; //当前处理的行号,不包含空格
//hasttable ht;
struct List* list;  //保存暂时不能处理的行

int formatline(int* a,int* b,const char* str)
{
     int ret = sscanf(str,"%d %d",a,b);
}

int Handler(int a,int b)
{

    curline++;
    if(b-a<curmax)
       return curmax;
    else
    {
       curmax = GetMaxOverRange(list,a,b);
       AddList(list,curline,a,b);
       PrintList(list);
       FilterList(list,curmax);
       printf("after filter %d\n",curmax);
        PrintList(list);
       //add to ht;
       //update curmax by item in ht
       //after update, then delete the item in dt
       //that arrange less than new curmax; to lowest memory
    }
}

void HanlderRecord(char* record)
{
     printf("Handler record:%s\n",record);
     int a,b;
     a=b=0;
     formatline(&a,&b,record);
     Handler(a,b);
}

void HandlerBuf(char arr[],int len)
{
     //cory arr to keepbuf
     int i,j;
     for(i=0;i<len;i++)
     {
             keepbuf[keeplen+i]=arr[i];
     }
     keeplen = keeplen + len;
     keepbuf[keeplen]='\0';
     int sindex=0;
     for(i=0;i<BUFSIZE*2&&i<keeplen;i++)
     {
             if('\n' == keepbuf[i])
             {
                   for(j=sindex;j<i;j++)//
                   {
                           record[j-sindex]=keepbuf[j];
                   }
                   record[i-sindex]='\0';
                   HanlderRecord(record);
                   sindex = i + 1;
             }
     }
     if(sindex>0&&keepbuf[keeplen-1]!='\n')
     {
          for(i=sindex,j=0;i<keeplen;i++,j++)
             keepbuf[j]=keepbuf[i];
          keeplen = keeplen - 1 - sindex + 1;
          keepbuf[keeplen]='\0';
     }
     else if(sindex==keeplen)//endwith \0
     {
         keeplen=0;
         keepbuf[keeplen]='\0';
     }
}



int main()
{
    memset(buf,'\0',BUFSIZE);
    memset(keepbuf,'\0',BUFSIZE*2);
    memset(record,'\0',40);
    list=(struct List*)malloc(sizeof(struct List));
    //char mystr1[BUFSIZE]="40 50 \n30 80\n40";
//    char mystr2[BUFSIZE]=" 90 \n10 80\n";
//    HandlerBuf(mystr1,strlen(mystr1));
//    HandlerBuf(mystr2,strlen(mystr2));
    int fd = open(INPUT,O_RDONLY);
    if(fd<0)
    {
            perror("open");
            exit(1);
    }
    int end=0;//0 means no file's end
    int rsize=0;
    while(0 == end)
    {
            rsize = read(fd,buf,BUFSIZE);
            if(rsize>0)
            {
                HandlerBuf(buf,rsize);
            }
            else if(0 == rsize)
            {
                 printf("Read File Done\n");
                 end = 1;
            }
            else
            {
                printf("Read Error\n");
                exit(1);
            }

    }
    printf("max range:%d\n",curmax);
    PrintList(list);
 	free(list);
    //HandlerBuf(keepbuf,keeplen);
    getchar();

}

 

 

 

分享到:
评论

相关推荐

    百度之星题目(2005-2010)

    自2005年起,百度公司主办的"百度之星"程序设计大赛成为每年一度的IT界盛事,吸引了无数编程爱好者和专业选手参与。该比赛不仅检验了参赛者的编程技巧,也推动了国内计算机科学教育的发展。以下将对2005年至2010年间...

    百度之星2005预赛决赛题目及源程序

    1. **初赛2005.doc**:这是2005年百度之星初赛的题目文档,通常包括多个问题,涉及数据结构、算法、逻辑推理等多个方面。通过分析这些题目,我们可以了解当时比赛的难度水平和常见题型,比如排序、搜索、图论等经典...

    历年百度之星程序设计大赛试题题目

    这些压缩包中的文件名称表明,我们拥有从2005年至2007年连续三年的百度之星程序设计大赛的初赛、复赛以及总决赛的题目文档。这些文档通常包含了详细的题目描述、输入输出格式、样例测试数据以及评分标准,是了解比赛...

    百度之星 题目分析.doc

    2014年的百度之星程序设计大赛中有一道名为“迷宫问题”的题目,该题目要求参赛者帮助一只名为“度度熊”的角色探索一个由m×n矩阵构成的迷宫。迷宫的规则如下: - 度度熊从迷宫的左上角出发; - 只能向上、向下或...

    2005年百度之星程序设计大赛试题初赛题.doc

    本文档是2005年百度之星程序设计大赛初赛试题,共四题,总分为100分。每题的描述、输入数据、输出数据和评分标准如下: 第一题:连续正整数 题目描述:一个正整数可以被表示为n(n&gt;=2)个连续正整数之和,例如15=1+2+...

    百度之星十年试题集

    - **背景介绍**:“百度之星”是由百度公司主办的一项面向全国大学生的程序设计竞赛,自2005年起至今已成功举办多届。该比赛旨在通过算法挑战激发学生的编程兴趣和创新能力,同时选拔出优秀的人才加入百度。 - **...

    百度之星历年试题

    【百度之星历年试题】是关于中国著名互联网巨头百度举办的一项技术竞赛——百度之星的历年考试题目集合。这个压缩包包含了2005年至2007年以及2011年的初赛和复赛试题,格式为PDF,方便学习者进行查阅和练习。 百度...

    百度编程大赛初赛练习题

    ### 百度编程大赛初赛练习题解析 #### 题目一:连续整数之和 **题目描述**: 本题考查的是如何判断一个正整数是否能表示为至少两个连续正整数之和,并找出所有可能的组合方式。 **示例**: - 例如数字15可以...

    百度之星历年预决赛试题(包括2009年)

    "百度之星历年预决赛试题(包括2009年)"这一资源包含了自2005年以来百度举办的“百度之星”编程竞赛的所有题目,旨在帮助参赛者或编程爱好者提升编程技能和解决问题的能力。这些试题涵盖了从初级到高级的各类编程...

    poj-ACM.zip_ 1706 References_ACM_ACM习题

    2. **2005年百度之星程序设计大赛试题初赛题目.doc**:这份文档包含了2005年百度主办的程序设计大赛初赛的题目,对于了解历年的竞赛题型和难度,以及学习如何解决实际问题具有很高的价值。 3. **poj题目**:POJ是...

Global site tag (gtag.js) - Google Analytics