HDU 4302 Holedox Eating(multiset)

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4302 Holedox Eating(multiset)相关的知识,希望对你有一定的参考价值。

http://acm.hdu.edu.cn/showproblem.php?pid=4302

题意:

在一条直线上,会有多条命令,如果是0,那么就会在x位置处出现一个蛋糕,如果是1,某人就会找到最近的蛋糕去吃。一开始在0坐标处,如果两边都有距离相同的蛋糕,则不改变方向。求经过的总距离。

 

思路:

multiset维护,每次1命令时在multiset找距离最近的即可。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<set>
  4 using namespace std;
  5 
  6 int L,n;
  7 multiset<int> s;
  8 multiset<int>::iterator it;
  9 
 10 int main()
 11 {
 12     //freopen("in.txt","r",stdin);
 13     int T;
 14     int kase = 0;
 15     scanf("%d",&T);
 16     while(T--)
 17     {
 18         s.clear();
 19         scanf("%d%d",&L,&n);
 20         int ans = 0;
 21         int pos = 0, dir = 1;
 22         for(int i=0;i<n;i++)
 23         {
 24             int op;
 25             scanf("%d",&op);
 26             if(op==0)
 27             {
 28                 int x; scanf("%d",&x);
 29                 s.insert(x);
 30             }
 31             else
 32             {
 33                 if(s.size()==0)  continue;
 34                 it = s.lower_bound(pos);
 35                 int tmp1 = -1, tmp2 = -1;
 36                 if(it!=s.end())
 37                 {
 38                     tmp1 = *it - pos;
 39                 }
 40                 if(it!=s.begin())
 41                 {
 42                     tmp2 = pos - *(--it);
 43                 }
 44                 if(tmp1 == 0)
 45                 {
 46                     if(tmp2==-1) s.erase(it);
 47                     else s.erase(++it);
 48                     continue;
 49                 }
 50                 if(tmp1 == -1)
 51                 {
 52                     ans += tmp2;
 53                     dir = 0;
 54                     pos = *it;
 55                     s.erase(it);
 56                 }
 57                 else if(tmp2 == -1)
 58                 {
 59                     ans += tmp1;
 60                     dir = 1;
 61                     pos = *it;
 62                     s.erase(it);
 63                 }
 64                 else if(tmp1 == tmp2)
 65                 {
 66                     if(dir == 1)
 67                     {
 68                         ans += tmp1;
 69                         pos = *(++it);
 70                         s.erase(it);
 71                     }
 72                     else
 73                     {
 74                         ans += tmp2;
 75                         pos = *it;
 76                         s.erase(it);
 77                     }
 78                 }
 79                 else
 80                 {
 81                     if(tmp1 < tmp2)
 82                     {
 83                         ans += tmp1;
 84                         dir = 1;
 85                         pos = *(++it);
 86                         s.erase(it);
 87                     }
 88                     else
 89                     {
 90                         ans +=tmp2;
 91                         dir = 0;
 92                         pos = *it;
 93                         s.erase(it);
 94                     }
 95                 }
 96             }
 97         }
 98         printf("Case %d: ",++kase);
 99         printf("%d\n",ans);
100     }
101     return 0;
102 }

 

以上是关于HDU 4302 Holedox Eating(multiset)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4302 Hdu 5301 Buildings

HDU 4302 贪吃蛇

POJ 1324 [Holedox Moving] 状态压缩BFS

C - Sweets Eating

poj1324 Holedox Moving

G - Eating Plan