hrbust 训练赛
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hrbust 训练赛相关的知识,希望对你有一定的参考价值。
链接:
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2069
题目:
Description
众所周知,十五酱有很多的衣服,而且十五酱东西收拾的非常糟糕。
所以十五酱经常找不到合适的衣服穿,于是她觉得收拾一下屋子,把衣服配成一套一套的~(即一件衬衫一件裤子。
十五酱一共有n件衣服,有衬衫有裤子,每一件衣服都有自己的属性值a(a是一个正整数,a<2^31)
十五酱每次手上只能拿一类衣服(如全是裤子,或全是衬衫
如果十五手上都是衬衫,那么当她拿到的下一件衣服是属性值为b的裤子时,她就会从手中的衬衫中找到属性值与这条裤子最接近的搭配成一套丢进衣柜中,如果有两件衣服和裤子的属性差值一样,那么十五就会选择属性值较小的一个衬衫。
如果十五手上的都是裤子,那么当她拿到的下一件衣服是属性值为b的衬衫时,她就会从手中的裤子中找到属性值与这条衬衫最接近的搭配成一套丢进衣柜中,如果有两件裤子和衣服的属性差值一样,那么十五就会选择属性值较小的一个裤子。
当然这样就会产生属性差了。。。。(即abs(a-b))
十五想知道她这样搭配衣服最终产生的属性差是多少
Input
多组数据
一行为一个正整数n(n<=80000)如题意;
接下来的n行,按到来时间的先后顺序描述了十五拿衣服种类和属性值
每行有两个正整数a, b,其中a=0表示衬衫,a=1表示裤子,b表示衬衫的特点值或是裤子的特点值。(同一时间内十五手上的衣服不会超过10000个)
Output
多组数据
每组数据输出一个正整数,表示十五搭配完全部衣服后的衣服属性差的总和mod 1000000以后的结果。
Sample Input
5
0 2
0 4
1 3
1 2
1 5
Sample Output
3
Hint
(abs(3-2) + abs(2-4)=3,最后一个裤子没有衣服可以配
解体思路:
读题可知手中只能拿一类衣服(衬衫或者裤子),然后匹配属性差最小,所以要查到最接近的匹配值,用low_bound很合适,之后匹配好就扔入衣柜,直到匹配完成
代码:
#include<bits/stdc++.h> using namespace std; const int mod = 1000000; int flag = -1; multiset<int>m; int main() { int n,a,b; while(scanf("%d",&n)!=EOF) { int sum = 0; for(int i = 0; i < n; i++) { scanf("%d%d",&a,&b); if(flag == -1) { flag = a; m.insert(b); } else if(a == flag) { m.insert(b); } else { multiset<int>::iterator it1; multiset<int>::iterator it2; it1 =m.lower_bound(b); it2 = it1; it1--; ///向上回溯 if(it2 == m.begin()) { sum = sum % mod +abs(b-*it2); m.erase(it2);///配对后丢入衣柜 } else if(it2 == m.end()) /* end()的功能:返回最后一个元素后面的迭代器iterator的地址, 则it2--,即it1;iterator */ { sum = sum % mod +abs(b - *it1); m.erase(it1); } else { if(abs(b - *it2)<abs(b - *it1)) { sum = sum % mod + abs(b - *it2); m.erase(it2); } else { sum = sum % mod + abs(b - *it1); m.erase(it1); } } if(m.empty()) ///注意判空,以便下次再衬衫或者裤子 { flag = -1; } } } printf("%d\n",sum%mod); } return 0; }
以上是关于hrbust 训练赛的主要内容,如果未能解决你的问题,请参考以下文章