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 straight pipe whose length is L. Holedox can only move along the pipe. Cakes may appear anywhere in the pipe, from time to time. When Holedox wants to eat cakes, it always goes to the nearest one and eats it. If there are many pieces of cake in different directions Holedox can choose, Holedox will choose one in the direction which is the direction of its last movement. If there are no cakes present, Holedox just stays where it is.

Input

The input consists of several test cases. The first line of the input contains a single integer T (1 <= T <= 10), the number of test cases, followed by the input data for each test case.The first line of each case contains two integers L,n(1<=L,n<=100000), representing the length of the pipe, and the number of events.

The next n lines, each line describes an event. 0 x(0<=x<=L, x is a integer) represents a piece of cake appears in the x position; 1 represent Holedox wants to eat a cake.

In each case, Holedox always starts off at the position 0.

Output

Output the total distance Holedox will move. Holedox don’t need to return to the position 0.

Sample Input

3

10 8

0 1

0 5

1

0 2

0 0

1

1

1

10 7

0 1

0 5

1

0 2

0 0

1

1

10 8

0 1

0 1

0 5

1

0 2

0 0

1

1

Sample Output

Case 1: 9

Case 2: 4

Case 3: 2

Author

BUPT

Source

2012 Multi-University Training Contest 1

题意:在一条直线上,从0开始, 每次都是吃最近的点,每次只能吃一个,在哪个位置吃的,吃过之后就在那个位置上站着。没有饼,就站在原地,如果离左右最近的点距离一样,就按照原来走的方向。

用到一个方法lower_bound(),返回一个大于等于key值的迭代器

代码:

#include <iostream>
#include <cstdio>
#include <set>
using namespace std;

int main(){

    int t, v = 1;
    scanf("%d", &t);
    while(t --){
        int l, n;
        scanf("%d%d", &l, &n);
        multiset<int >a;
        int c, b;
        int sum = 0, cur = 0, dir = 0;
        for(int i = 0; i < n; ++i){
            scanf("%d", &c);
            if(c == 0){
                scanf("%d", &b);
                a.insert(b);
            }
            else{
                if(a.size() == 0) continue;
                multiset<int >::iterator it = a.lower_bound(cur);
                if(it == a.end()){
                        --it;
                        int ww = (*it);
                        dir = -1;
                        sum += (cur - (*it));
                        cur = (*it);
                        a.erase(it);
                }
                else if((*it) == cur){
                        int ww = (*it);
                        //cur = (*it);
                    a.erase(it);
                }
                else{
                    if(it == a.begin()){
                        int ww = (*it);
                        dir = 1;
                        sum += (*it)-cur;
                        cur = (*it);
                        a.erase(it);
                    }
                    else{
                        int ww = (*it);
                        multiset<int >::iterator d = it;
                        --d;
                int qqqq = (*d);
                        int te = (cur - (*d));
                        int temp = ((*it) - cur);
                        if(te == temp){
                            if(dir > 0){
                                sum += temp;
                                cur = (*it);
                                a.erase(it);
                            }
                            else{
                                sum += temp;
                                cur = (*d);
                                a.erase(d);
                            }
                        }
                        else if(te < temp){
                            dir = -1;
                            sum += te;
                            cur = (*d);
                            a.erase(d);
                        }
                        else{
                            dir = 1;
                            sum += temp;
                            cur = (*it);
                            a.erase(it);
                        }
                    }
                }
            }
        }
        printf("Case %d: %d\n", v++, sum);
    }
    return 0;
}
时间: 2024-10-04 04:21:36

Hdoj 4302 Holedox Eating 【multiset】的相关文章

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&g

【multiset】hdu 5349 MZL&#39;s simple problem

[multiset]hdu 5349 MZL's simple problem 题目链接:hdu 5349 MZL's simple problem 题目大意 n次操作,插入元素.删除最小元素.查询最大元素并输出. C++STL的multiset的使用 set--多元集合(元素不可重复),multiset--可重复元素的多元集合 多元集合(MultiSets)和集合(Sets)相像,只不过支持重复对象.(具体用法请参照set容器) set和multiset内部是以平衡二叉树实现的: 从内部数据结

hdoj 1863 畅通工程 【最小生成树】+【kruskal】

题意:... 难点:如何判断是不是信息不全:在输入的时候建立并查集,之后判断有几个节点就可以了,剩下的就是kruskal算法. 代码: #include<stdio.h> #include<string.h> #include<algorithm> #define MAXN 105 #define INF 0x3f3f3f3f using std::sort; struct node{ int from; int to; int w; }edges[MAXN*MAXN]

hdoj 2391 Filthy Rich 【DP】

题目大意:有个二维数组,你从(0,0)出发,最终到(n,m), 在这个二维数组中,每个位置dp[i][j]都有一定量的黄金,你可以拾取,问你最多能失去多少,并且,你的方向有下,右, 斜向下三个方向: 策略:就是每一个都加上它的上方向与左方向的最大值,这样到最后就是最大值.详情见代码 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2391 代码: #include<stdio.h> #include<string.h> int dp[1

hdoj 1045 Fire Net 【DFS】

题意:如果两个点要放在同一行或者同一列,那么两个点中间要有一个墙,否则的话只能放一个点,最后问你最多能放几个点. 看了一个星期.. 这道题的解法我还是第一次见,就是逐个逐个的来放置每个点,然后每经过一个点都判断一次,详情看代码 代码: #include <stdio.h> #include <string.h> int ans, n; char map[10][10]; int judge(int lin, int row) { int i; for(i = lin-1; i &g

hdoj 4907 Task schedule 【预处理】

题意:中文题,你懂得... 思路:建两个数组,一个标记,一个放答案(就是最快能处理的任务点), 在输入数据的时候标记改位置已经有任务了,并且找出来一个最大的数max.然后从max+1,出发从大到小,依次用temp定义没有任务的序号,如果是没有被标记那么就将该处的答案定义为temp. 题目链接 点击打开链接 代码: #include<stdio.h> #include<string.h> #define MAXN 200005 int vis[MAXN], ans[MAXN]; in

hdoj 2082 找单词 【母函数】

题意:a~z的价值分别是1~26,给出你a~z的个数,问最多能组成价值不同的种类数. 策略:母函数. 典型的母函数题,但是这是属于给你有限个数目的题,要小心. 直接上代码: #include<string.h> #include<stdio.h> int ans[55]; int c1[100], c2[100]; int main() { int a[27], t, i, j, k; scanf("%d", &t); while(t --){ mems

零基础(伪)HDOJ水题总结【1】

首先要解决的是输入输出的问题.作为一个渣渣新手,我用以前学的 C++写了错误代码提交,后果可想而知. 所以认认真真的看了[ACM新手之八大输入输出],格式记好,在后面运用会越用越熟的.2000很easy的一题,首先,现在假设我什么都不会(至少编译器,头文件,基本格式知道)我要解决该怎么办?(以后需要学的和缺少的直接补上,不多说.)1.比较大小,高中算法讲过.我搜到的[冒泡排序]以后再探讨.2.但是getchar()的用法,忘了.我只知道用一个东西(…)把字符转化成ASCII码,然后可以排序. 百

hdoj 4790 Just Random 【数学】

题目:hdoj 4790 Just Random 题意:给你两个闭区间[a,b],[c,d],分别从中等可能的跳出 x 和 y ,求(x+y)%p == m的概率 分析: 假如是[3,5] [4,7]   p = 2 , m = 1: 则所有的和 7 8 9 10 8 9 10 11 9 10 11 12 1 2 3 3 2 1 后面一行出现次数,可以发现可以分成三部分,第一部分递增的等差数列,第二部分值都相等,第三部分等差数列 然后用等差数列求和公式求和就ok AC代码: #include<i