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 }

 

转载于:https://www.cnblogs.com/zyb993963526/p/7855934.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值