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 }
时间: 2024-10-04 01:10:41

HDU 4302 Holedox Eating(multiset)的相关文章

Hdoj 4302 Holedox Eating 【multiset】

Holedox Eating Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3430 Accepted Submission(s): 1178 Problem Description Holedox is a small animal which can be considered as one point. It lives in a s

hdu 5349 MZL&#39;s simple problem(multiset)

代码: #include<set> #include<cstdio> using namespace std; multiset<int> st; int main() { int n; multiset<int>::iterator it; while(scanf("%d",&n)==1) { st.clear(); int k,num; for(int i=0; i<n; i++) { scanf("%d&qu

HDU 1045 - Fire Net (最大独立集)

题意:给你一个正方形棋盘.每个棋子可以直线攻击,除非隔着石头.现在要求所有棋子都不互相攻击,问最多可以放多少个棋子. 这个题可以用搜索来做.每个棋子考虑放与不放两种情况,然后再判断是否能互相攻击来剪枝.最后取可以放置的最大值. 这里我转化成求最大独立集来做. 首先将每个空地编号,对于每个空地,与该位置可以攻击到的空地连边.找最多的空地使得不互相攻击,即求该图的最大独立集.与搜索做法基本一致,但是说法略有不同. 1 #include<iostream> 2 #include<cstring

hdu oj1102 Constructing Roads(最小生成树)

Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13995    Accepted Submission(s): 5324 Problem Description There are N villages, which are numbered from 1 to N, and you should

HDU 1863 畅通工程 (最小生成树)

Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本.现请你编写程序,计算出全省畅通需要的最低成本. Input 测试输入包含若干测试用例.每个测试用例的第1行给出评估的道路条数 N.村庄数目M ( < 100 ):随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间

hdu 3650 Hot Expo(贪心)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3650 --------------------------------------------------------------------------------------------------------------------------------------------

hdu 4970 Killing Monsters(数学题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4970 Problem Description Kingdom Rush is a popular TD game, in which you should build some towers to protect your kingdom from monsters. And now another wave of monsters is coming and you need again to k

HDU 3572 Task Schedule(ISAP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572 题意:m台机器,需要做n个任务.第i个任务,你需要使用机器Pi天,且这个任务要在[Si  ,  Ei]区间内完成才有效.对于一个任务,只能由一个机器来完成,一个机器同一时间只能做一个任务.当然,一个任务可以分成几段不连续的时间来完成.问,能否做完全部任务. 题意很清晰,也就是判断是否是满流. 对于网络流问题,模板大家都有,关键在于如何建图(详见资料) 思路:今天问了龙哥,对建图有了一定的了解,

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方