• 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 }
  • 相关阅读:
    线性代数思维导图——3.向量
    微分中值定理的基础题型总结
    构造函数
    Python课程笔记(七)
    0241. Different Ways to Add Parentheses (M)
    0014. Longest Common Prefix (E)
    0013. Roman to Integer (E)
    0011. Container With Most Water (M)
    0010. Regular Expression Matching (H)
    0012. Integer to Roman (M)
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7855934.html
Copyright © 2020-2023  润新知