zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    Qt 无边框窗体改变大小 完美实现
    深入Windows窗体原理及控件重绘技巧
    EF里Guid类型数据的自增长、时间戳和复杂类型的用法
    Entity Framework中的Identity map和Unit of Work模式
    使用SQLite数据库和Access数据库的一些经验总结
    实现Avl平衡树
    使用Ajax
    接口和类 反射的差异性
    Guacamole 介绍
    依赖注入(DI)和Ninject
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7855934.html
Copyright © 2011-2022 走看看