May the force be with you!
posts - 52,  comments - 33,  trackbacks - 0

        
      这个题目原来比赛WA了,后来一直没有做出来,最近比赛又遇上,郁闷地想了好几天,我在网上没有找到正确答案,昨天向tank请教,终于知道了算法,今天AC了,写出来吧……

题目来源:ICPC2003广州赛区
题目网址:http://acm.pku.edu.cn/JudgeOnline/problem?id=1771

算法:二分+贪心

         计算出一个需要可行的时间,然后用二分法枚举可能的解,判断解的可行性时用贪心策略:对每个人,检验他能在规定时间内到达,如果不能到达,则需要多停靠一次,解不等式找出能停靠的最高楼层(证明就算了,说明一下:因为要求的是每个人都能在指定时间能到达,所以贪心选择使得电梯的停靠层往上同时满足当前的人能在规定时间能到达即可,这样再往上的人离停靠的楼层就近一些……)。
        我的代码风格很好(自己暂时这么认为:-)),还不清楚就看代码了……

类似题目:POJ1744http://acm.pku.edu.cn/JudgeOnline/problem?id=1744
                    WOJ1297  Elevator Stopping Plan



  1/*****************************************
  2Date:2007-10-29
  3Author:littlekid
  4
  52844442    LittleKid    1771    Accepted    216K    0MS    G++    2063B    2007-10-29 17:12:02
  6
  7**********************************************/

  8
  9
 10# include <stdio.h>
 11# include <string.h>
 12
 13# define N 33
 14
 15int n;
 16int tar[N];
 17
 18int ans;
 19int stop;
 20int station[N],result[N];
 21
 22int MIN(int a,int b)
 23{
 24    return a>b?b:a;
 25}

 26
 27void init()
 28{
 29    for (int i = 1;i <= n; i ++)
 30    {
 31        scanf("%d",&tar[i]);
 32    }

 33}

 34
 35bool isOK(int time)
 36{
 37    int t_st=1,t_ti=0;
 38    int tmp;
 39    stop=0;
 40    for (int i=1;i<=n;i++)
 41    {
 42       // if (canGet(i,t_st,t_ti)) continue ;
 43        if (tar[i] <= t_st) continue;
 44        tmp = t_ti+(tar[i]-t_st)*20;
 45        if (tmp <= time) continue ;
 46        
 47        //getStop();
 48        if (t_st == 1)
 49        {
 50            tmp = time - t_ti + (4*t_st+20*tar[i]);
 51        }

 52        else
 53        {
 54            tmp = time - (t_ti+10+ (4*t_st+20*tar[i]);
 55        }

 56        tmp /= 24;
 57        if (tmp<tar[i]) return false;
 58        if (t_st==1)
 59        {
 60            t_ti+= (tmp-t_st)*4;
 61        }

 62        else
 63        {
 64            t_ti += 10+(tmp-t_st)*4;
 65        }

 66        t_st = tmp;
 67        stop++; station[stop]=t_st;
 68       // printf("-->%d\n",t_st);
 69    }

 70    
 71    return true;
 72}

 73
 74void solve()
 75{
 76    ans = tar[n]*4+20*(tar[n]-tar[1]);
 77    result[0]=1; result[1]=tar[n];
 78    
 79    int low=0,up=ans-1,mid;
 80    while (low<up)
 81    {
 82        mid = (low+up)/2;
 83        if (isOK(mid))
 84        {
 85            {
 86                result[0]=stop;
 87                for (int i=1;i<=stop;i++)
 88                {
 89                    result[i] = station[i];
 90                }

 91                ans = mid;
 92            }

 93            up = mid;
 94        }

 95        else
 96        {
 97            low = mid+1;
 98        }

 99    }

100}

101
102void output()
103{
104    printf("%d\n%d",ans,result[0]);
105    for (int i=1;i<=result[0];i++)
106    {
107        printf(" %d",result[i]);
108    }

109    printf("\n");
110}

111
112int main()
113{
114    while (1)
115    {
116        scanf("%d",&n);
117        if (n == 0break;
118        init();
119        solve();
120        output();
121    }

122    return 0;
123}
posted on 2007-10-29 21:35 R2 阅读(695) 评论(0)  编辑 收藏 引用 所属分类: Standing Programs

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


你是第 free hit counter 位访客




<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(4)

随笔分类(54)

随笔档案(52)

文章档案(1)

ACM/ICPC

技术综合

最新随笔

搜索

  •  

积分与排名

  • 积分 - 61650
  • 排名 - 357

最新评论

阅读排行榜

评论排行榜