题目大意:一个动物吃一根长度为L的管子上的饼干,0代表放饼干,1吃最近的饼干
map直接找到上下限,进行比较就可以了
map的基本操作函数:
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
参考了一下别人的代码,重在学习
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
using namespace std;
int main()
{
int T;
scanf("%d" , &T);
int k = 1;
while(T--)
{
int L , n;
map<int , int>M;
scanf("%d %d" , &L , &n);
int a , b;
map<int , int>::iterator it1 , it2;
M[1000000] = 1;
M[-1000000] = 1;
int num = 0 , pos = 0 ;
int dir = 1 ;
for(int i = 0 ; i < n ; i ++ )
{
scanf("%d" , &a);
if(a == 0)
{
scanf("%d" , &b);
M[b]++;
}
else
{
it1 = M.lower_bound(pos);
if(it1 -> first == pos)
{
it1 -> second --;
if(it1 -> second == 0) M.erase(it1);
}
else
{
it1 --; //map有序存储
it2 = M.upper_bound(pos);
if(it1->first==-1000000&&it2->first==1000000) continue;
if(pos - it1 -> first == it2 -> first - pos)
{
if(dir == 1)
{
it2 -> second -- ;
num += it2 -> first - pos;
pos = it2 -> first;
if(it2 -> second == 0) M.erase(it2);
}
else
{
it1 -> second -- ;
num += pos - it1 -> first;
pos = it1 -> first;
if(it1 -> second == 0) M.erase(it1);
}
}
else if(pos - it1 -> first > it2 -> first - pos)
{
dir = 1;
it2 -> second -- ;
num += it2 -> first - pos;
pos = it2 -> first;
if(it2 -> second == 0) M.erase(it2);
}
else
{
dir = 0;
it1 -> second -- ;
num += pos - it1 -> first;
pos = it1 -> first;
if(it1 -> second == 0) M.erase(it1);
}
}
}
}
printf("Case %d: %d\n" ,k++ , num);
}
return 0;
}