zoukankan      html  css  js  c++  java
  • 在线做题---呼叫转移系统

      最近看到了伯乐在线编程挑战赛,觉得题目还比较适中,而且出发点非常好,至少对我这种菜鸟来说。首先,他不排名,其次还公布大家提交的源码,如果不会的话,可以参考别人的代码。并且可以学习高手们的思路和编码风格,对自己有非常大的帮助。以后我会一直坚持跟进他的题目。

      今天把第0期的呼叫转移系统的题目看了下,第一次自己写的时候,没把情况考虑全。后来参考了别人的思路,最终把它给弄出来了。

         要解决的就两个问题:

      1)当天设置了多少个呼叫转移
      2)最长的呼叫转移是多长次 ( A君转到B君,B君再转到C君。这个是2次呼叫转移)

      第一个问题很好解决,只需判断要求的那天是否在某个人的假期里,在的话,总数++就OK了。

      对于第二个问题,我的思路是遍历每个人,然后判断每个在假期里的人在那天总共要转移多少次,即找到他在那天要转移到哪个号码上,被转移到的那个好吗还是在假期,那么再递归求下一个,最后就能得到总的转移次数。再比较得出最大的那个即可。

      如果要判断是否存在环路的话,那么只要在求最大转移次数的时候,记录下初始号码,然后再每次查找下一个号码的时候判断一下是否跟初始号码相同,如果相同的话就存在环路。我在程序里面就没有实现这一步了,因为题目的输入假设是不存在环路的。

    下面是我的代码实现:

    //伯乐在线编程  第一期 呼叫转移系统
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    typedef struct  
    {
        char szSrcNum[5];
        char szDstNum[5];
        int nStartDay;
        int nPeriod;
    }PERSON;
    
    PERSON *p;
    int nPerson;  //总人数
    int nDay;  //计算天数
    
    
    int onHoliday(PERSON *p);  //判断是否在度假
    int totalCount(); //求当天呼叫转移的总次数
    int Depth();
    int Calc(char *s);
    int Match(char *s);
    
    int main()
    {
        int i,n = 0;
        int nMax = 0; //最长的呼叫转移次数
        int nCount = 0; //呼叫转移总次数
        FILE *fp;
    
        fp = fopen("in.txt","r");
        if (fp == NULL)
        {
            printf("FOPEN ERROR
    ");
            return 0;
        }
    
        fscanf(fp,"%d",&nPerson);
        p = (PERSON *)malloc(nPerson * sizeof(PERSON));
        if (p == NULL)
        {
            printf("MALLOC ERROR
    ");
            return 0;
        }
    
        while (n < nPerson)
        {
            fscanf(fp,"%s%s%d%d",(p+n)->szSrcNum,(p+n)->szDstNum,
                &(p+n)->nStartDay,&(p+n)->nPeriod);
            n++;
        }
        fscanf(fp,"%d",&nDay);
    
        for (i = 0; i < nPerson; i++)
        {
            printf("Person %d: %s %s %d %d.
    ",i,(p+i)->szSrcNum,(p+i)->szDstNum,
                (p+i)->nStartDay,(p+i)->nPeriod);
        }
    
        nCount = totalCount();
        nMax = Depth();
    
        printf("第 %d 天共有 %d 个呼叫转移设置
    ",nDay,nCount);
        printf("第 %d 天最长的呼叫转移是 %d 次
    ",nDay,nMax);
      
      free(p);
    return 0; } int onHoliday(PERSON *p) { int tmp = p->nStartDay + p->nPeriod - 1; if (p->nStartDay < nDay && tmp >= nDay) return 1; if (p->nStartDay == nDay) return 1; return -1; } int totalCount() { int i,nCount = 0; for (i = 0; i < nPerson; i++) { if (1 == onHoliday(p+i)) nCount++; } return nCount; } int Depth() { //求最大的呼叫转移次数 int i,nRet,nMax = 0; for (i = 0; i < nPerson; i++) { if (1 == onHoliday(p+i)) { nRet = Calc((p+i)->szDstNum); } nMax = nMax > nRet ? nMax : nRet; } return nMax; } int Calc(char *s) { int nRet; if ((nRet = Match(s)) > 0) { return Calc((p+nRet)->szDstNum) + 1; } else return 1 ; } int Match(char *s) { int i; for (i = 0; i < nPerson; i++) { if (0 == strcmp((p+i)->szSrcNum,s) && //找到目的地址并且也在度假 1 == onHoliday(p+i)) { return i; } } return 0; }

    2013/6/16 16:02
  • 相关阅读:
    HDU 4565 So Easy!(数学+矩阵快速幂)(2013 ACM-ICPC长沙赛区全国邀请赛)
    HDU 4568 Hunter(最短路径+DP)(2013 ACM-ICPC长沙赛区全国邀请赛)
    URAL 1664 Pipeline Transportation(平面图最大流)
    HDU 1250 Hat's Fibonacci(高精度)
    HDU 1042 N!(高精度乘)
    算法模板の计算几何
    算法模板の数据结构
    算法模板の数学&数论
    算法模板之图论
    HDU 3260/POJ 3827 Facer is learning to swim(DP+搜索)(2009 Asia Ningbo Regional)
  • 原文地址:https://www.cnblogs.com/Jason-Damon/p/3139032.html
Copyright © 2011-2022 走看看