1. 程式人生 > >hrbust 訓練賽

hrbust 訓練賽

順序 its 超過 printf empty namespace include pre mod

鏈接:

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 訓練賽