hdu--4585--lower_bound()

好久不见     lower_bound()

最近 事情太多了 龙兄 来了宁波 我们几个一起陪他玩了几天 那几天就没碰过题了 昨天他回临安了 明年应该就是我们宁波这3个 过去找他了

我们 设计了很多创业大计 描绘了美好的蓝图 就差 资金到位了 哈哈~~

-------

这题的话 就是开始给你一个人的ID与他的能力值  起初这个集合中只有 一个人:Id 1  能力值 1000000000

后来 每次加入一个人的时候 总是要从这个集合中 找出一个人与他进行PK 这个人的能力值要与他是得到这样的关系min( abs(new-old) )因为这是绝对值得 所以如果存在上界与下界同时满足 取下界 即小于<new的值  

这样每次插入一个 输出一个 最后就可以了

但是我的代码 运行时间好tm长啊 要900+ms 一共给的时间也就1000ms 我也是 醉了

顺便 提下lower_bound(var)函数是返回一个序列中大于等于var的第一个位置  注意这是一个前闭后开的区间 所以如果这个var大于这个序列的所有元素 那么返回的将是一个没有元素的位置 即xx.end()

 1 #include <iostream>
 2 #include <map>
 3 using namespace std;
 4 
 5 map<int,int>mp;
 6 
 7 int main()
 8 {
 9     cin.sync_with_stdio(false);
10     int n , Id , grade , var , num;
11     while( cin >> n && n )
12     {
13         mp.clear( );
14         map<int,int>::iterator ans;
15         mp[1000000000] = 1;
16         for( int i = 0 ; i<n ; ++i )
17         {
18             cin >> Id >> grade;
19             if( !i )
20             {
21                 cout << Id << " " << 1 << endl;
22             }
23             else
24             {
25                 ans = mp.lower_bound( grade );
26                 if( ans == mp.begin() )
27                     cout << Id << " " << ans->second << endl;
28                 else
29                 {
30                     var = ans->first;
31                     num = ans->second;
32                     --ans;
33                     if( var-grade < grade-(ans->first) )
34                         cout << Id << " " << num << endl;
35                     else
36                         cout << Id << " " << ans->second << endl;
37                 }
38             }
39             mp[ grade ] = Id;
40         }
41     }
42     return 0;
43 }
View Code

 

today:  

  你说 谈恋爱需要靠什么呢?

  我什么都不想罗列

  最后反正是看脸

  

 

posted @ 2014-10-26 16:21  radical  阅读(201)  评论(0编辑  收藏  举报