六月
09

POJ 3061和3750解题报告

捕获 好久没更新博客了,为了表示我还没放弃博客,特水水的更新一下,贴两道算法题吧。

不对,其实是应该算是数据结构题,因为没用到什么算法,只用到了数据结构。

其一是3750,小孩报数问题。

题目描述:有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。

输入:第一行输入小孩的人数N(N<=64)
接下来每行输入一个小孩的名字(人名不超过15个字符)
最后一行输入W,S (W < N),用逗号","间隔

输出:按人名输出小孩按顺序出列的顺序,每行输出一个人名

这道题因为只有一组测试用例,并且数据量不大,<64。用暴力法也不会出现超时,超内存等问题。我用的是循环链表,不过不是动态的,因为数据量小,所以一开始直接用数组开辟64个地址空间,然后再将每个元素起来,首尾也相连。POJ上成绩是116K,0MS,第四名。

/*
@struct date 链表节点类型,包含字符数组和指向下一个节点的指针
@j 记录报数
*/
 
#include <stdio.h>
 
#define N 64
 
typedef struct date{
 
    char name[16];
 
    struct date *next;
 
}date;
 
int main(){
 
    date a[N],*p;
 
    int n,w,s,i,j;
 
    scanf("%d",&n);
 
    for(i=0;i<n;i++){
 
        scanf("%s",a[i].name);
 
        a[i].next=(i==n-1)?a:&a[i+1];//将数组中元素关联起来,最后一个元素指向第一个元素,形成一个环
 
    }
 
    scanf("%d,%d",&w,&s);
 
    j=0;
 
    p=w<2?&a[n-1]:&a[w-2];
 
    while(p&&n>0){
 
        j++;
 
        if(j==s){//报到指定数字
 
            printf("%s\n",p->next->name);//输出小孩姓名
 
            j=0;
 
            p->next=p->next->next;//小孩出列(将下一个节点交给前一个节点的指针)
 
            n--;
 
        }else p=p->next;//向后报数
 
    }
 
    return 0;
 
}
 

其一是3061

Description:A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements of the sequence, the sum of which is greater than or equal to S.

题目描述:有元素个数不超过N=100 000的整数序列,其中每个整数都小于10 000,然后求序列中元素个数最少的的一个子段(子段的元素之和大于等于S),S小于100 000 000

输入:第一行输入测试的数据数目,每个测试用例包含两行,第一行是N S,第二行是N个元素序列。

输出:每行输出一个求得的最小子段元素数目

这道题和最大子段类似,可以用单向队列来做,每个元素都要进次队列,维护队列中元素之和大于等于S,记录最小的队列中元素个数。POJ成绩:536K,63MS

/*
 @num 测试用例个数
 @n 每个用例元素个数
 @min 最小的队列元素个数
 @sum 队列中元素之和
 @front 队首
 @rear 队尾
*/
 
#include <stdio.h>
 
#define N 100000
 
void main(){
 
    int a[N],num,n,s,i,min,sum,front,rear;
 
    scanf("%d",&num);
 
    while(num--){
 
        scanf("%d%d",&n,&s);
 
        sum=0;min=N;
 
        front=rear=0;
 
        for(i=0;i<n;i++){
 
            scanf("%d",&a[i]);
 
            if(sum+a[i]<0){
 
                sum=a[i];
 
                rear=i;
 
            }else{
 
                sum+=a[i];
 
            }
 
            front++;/*printf("%d %d %d\n",front,rear,sum);*/
 
            if(sum>=s){
 
                while(rear<front){
 
                    if(sum-a[rear]<s){
 
                        break;
 
                    }else{
 
                        sum-=a[rear];
 
                        if(sum==0)
 
                            break;
 
                        rear++;
 
                    }
 
                }
 
                min=min>front-rear?front-rear:min;/*printf("%d=%d-%d\n",front-rear,front,rear);*/
 
            }
 
        }
 
        printf("%d\n",min==N?0:min);
 
    }
 
}
 

POJ测试数据中不包含负数,我贴的代码可以对包含负数的序列处理,S也可以为负数。

最后给个包含负数的测试用例:

输入:

3

10 -15

-18 0 -1 -10 -99 -91 -94 -99 -90 –98

10 15

1 -10 1 14 1 7 4 9 2 8

10 0

-1 –3 –2 0 2 12 –43 –4 –7 3

输出:

1

2

1

本文标签: , , ,

分享

本文短网址: http://qiqi.boy.im/1i

这篇文章已经有 26 条评论

Comments (26) Trackbacks (0)
You can leave a response or Trackback this entry .
  1. A.shun -#1

    看不懂。。、好久没沙发了,不能放过啊

  2. 丕子 -#2

    爱好还挺广泛的啊 做了多少题了

  3. 万戈 -#3

    为了表示我来过,我也水水地留个言

  4. 阿邙 -#4

    俺跟随着万戈兄的脚步 就来啦~

  5. neoear -#5

    数学够我头疼了,编程更加头疼。。。

  6. Firm -#6

    这些基本都是返给老师了

  7. Bee君 -#7

    看见一堆编程我就晕!@o@”了

  8. 疯子 -#8

    感觉博客有点乱,不是内容还是非常棒的

  9. Dianso -#9

    我最怕的就是学C语言了,幸好这个学期没了

  10. AnTony -#10

    呵呵,学习编程需要有兴趣!加油吧!人生的道路总是需要经历些

  11. 秦大少 -#11

    看不懂 纯支持了

  12. 哲哲 -#12

    布局很花哨··这个poj我第一次听到·

  13. 丕子 -#13

    第二个 a定义了?

  14. 夏影残雪 -#14

    水水的表示我看不懂……

  15. 陆少博 -#15

    这对于我有点难度,俺脑子笨。

  16. 维C生活网 -#16

    好吧,我承认我啥也看不懂

  17. aisinvon -#17

    你终于换了个比较清晰的主题啊 :grin:

  18. snowxh -#18

    原来你也是pku的 膜拜

    • QiQiBoY --#1

      @snowxh
      。。。我是我的,不是PKU的。。 :grin:
      另外wp rc reply ajax插件已经升级到1.1,你说的功能我都实现了,可以试用了。

    • snowxh --#2

      @QiQiBoY
      认错人了 :mad: 刚刚还跟静夜燃香说她那那个插件只在侧边栏显示成功正文不显示回复内容来着…

    • QiQiBoY --#3

      @snowxh
      囧。。看来我写代码已经头晕了。。。刚更新的插件但愿别出现问题。。。

    • 静夜燃香 --#4

      @QiQiBoY
      看到提起我的名字,果断冒头~~

    • QiQiBoY --#5

      @静夜燃香
      仔细想了一下我为什么会认错人:一是老和你邮件联系,忘记了你的这个昵称。二是你俩头像其实很像,只是一个现代风,一个古典风;三是我已经很困了,脑袋秀逗了 :cry:

  19. afire -#19

    不得不说,你很厉害,我根本不会想到什么循环链表。哎,把数据结构还给学校了。

  20. Maplews -#20

    - -,没学过计算机. 没做过一道这样的题

  1. No trackbacks yet.

Leave a Reply

Hi , say something.

  • :?:
  • :razz:
  • :sad:
  • :evil:
  • :!:
  • :smile:
  • :oops:
  • :grin:
  • :eek:
  • :shock:
  • :???:
  • :cool:
  • :lol:
  • :mad:
  • :twisted:
  • :roll:
  • :wink:
  • :idea:
  • :arrow:
  • :neutral:
  • :cry:
  • :mrgreen: