HDU 4302 Holedox Eating(multiset)
Posted 谦谦君子,陌上其华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于HDU 4302 Holedox Eating(multiset)的主要内容,如果未能解决你的问题,请参考以下文章