程序设计与算法(三)第九周测验(2018春季)

题目网址:http://cxsjsxmooc.openjudge.cn/2018t3springw9/

【1:Set】

用multiset记录当前整数集数据信息

用set记录曾被加入集合的数

 1 #include <iostream>
 2 #include <set>
 3 #include <string>
 4 using namespace std;
 5 
 6 
 7 int main()
 8 {    
 9 
10   multiset<int> s;
11   set<int> is;
12   string str;
13   int n,value;
14   s.clear();
15   cin>>n;
16   while(n--){
17       cin>>str>>value;
18       if(str=="add"){
19           s.insert(value);
20           cout<<s.count(value)<<endl;
21           is.insert(value);
22     }
23     else if(str=="ask"){
24         if(is.count(value)){
25             cout<<1<<" ";
26         }
27         else{
28             cout<<0<<" ";
29         }
30         cout<<s.count(value)<<endl;
31     }
32     else if(str=="del"){
33         cout<<s.count(value)<<endl;
34         s.erase(value);
35     }
36   }
37     return 0;
38 }
编程题 1:Set

 

 

【2:热血格斗场】

lower_bound(power)返回 第一个 元素(map里的元素)的key值大于等于power值 的迭代器
 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4 using namespace std;
 5 
 6 
 7 int main()
 8 {
 9     map<int, int> m;
10     m.insert(make_pair(1000000000, 1));
11     int n;
12     cin >> n;
13     while (n--) {
14         int id, power;
15         cin >> id >> power;
16         map<int, int>::iterator i;
17         i=m.lower_bound(power);
18         if (i == m.begin()) {
19             cout << id << " " << i->second << endl;
20         }
21         else {
22             map<int, int>::iterator p = i--;
23             if (power - i->first <= p->first - power) {
24                 cout << id << " " << i->second << endl;
25             }
26             else {
27                 cout << id << " " << p->second << endl;
28             }
29         }
30         m.insert(make_pair(power, id));
31     }
32     return 0;
33 }
编程题 2:热血格斗场

 

 

【3:冷血格斗场】

 注意到相同实力值的人中,只有id号最小的那个人有可能与新人比赛,其他人可以当做不存在。

因此,这样实力值便各不相同,就仍用map即可

故需在考虑是否在map中插入新值:若新人的实力值已存在,则该实力值对应的新id为min{新人的id,该实力值当前的id};

 1 #include <iostream>
 2 #include <map>
 3 #include <string>
 4 using namespace std;
 5 
 6 
 7 int main()
 8 {
 9     map<int, int> m;
10     m.insert(make_pair(1000000000, 1));
11     int n;
12     cin >> n;
13     while (n--) {
14         int id, power;
15         cin >> id >> power;
16         map<int, int>::iterator i;
17         i = m.lower_bound(power);
18         if (i == m.begin()) {
19             cout << id << " " << i->second << endl;
20             if (power != i->first) {
21                 m.insert(make_pair(power, id));
22             }
23             else {
24                 if (id<i->second) {
25                     m[i->first] = id;
26                 }
27             }
28         }
29         else {
30             map<int, int>::iterator p = i--;
31             if (power - i->first < p->first - power) {
32                 cout << id << " " << i->second << endl;
33                 m.insert(make_pair(power, id));
34             }
35             else if (power - i->first > p->first - power) {
36                 cout << id << " " << p->second << endl;
37                 if (power != p->first) {
38                     m.insert(make_pair(power, id));
39                 }
40                 else {
41                     if (id<p->second) {
42                         m[p->first] = id;
43                     }
44                 }
45             }
46             else {
47                 cout << id << " ";
48                 if (i->second < p->second) {
49                     cout << i->second << endl;
50                 }
51                 else {
52                     cout << p->second << endl;
53                 }
54                 m.insert(make_pair(power, id));
55             }
56         }
57     }
58     return 0;
59 }
编程题 3:冷血格斗场

 

 

【4:编程填空:数据库内的学生信息】

【提示】

1、根据以下两句:

MyMultimap<string,int> mp;
MyMultimap<int,string,less<int> > mp2;
这意味着模板类应有3个typename或class,并且第三个有默认值
又根据 Print(mp.begin(),mp.end()); //按 姓名从大到小 输出
应写一个自己的greater<typename>模板

2、
根据cout << * first 
应该写一个
template <typename T1, typename T2>
ostream& operator << (ostream& os, pair<T1, T2> i) ;
内容根据输出要求来写
3、
根据
mp.Set("Tom",78); //把所有名为"Tom"的学生的成绩都设置为78
Set函数用 multimap的equal_range函数来实现

4、
MyMultimap<string,int>::iterator p = mp.find(name);
//这里::双冒号说明是在自定义的类中再定义一个类,class iterator  
但可以发现iterator其实代表std::multimap<key,value>::iterator
故在自己写的
MyMultimap类中写一句
typedef typename multimap<T1, T2>::iterator iterator;
即可

本题也可参考博客
https://blog.csdn.net/iamiman/article/details/53375357

 1 template<class T>
 2 struct myGreater {  
 3     bool operator() (const T& x, const T& y) const { return x>y; }  
 4 };  
 5 
 6 template <typename T1, typename T2,typename pred=myGreater<T1> >
 7 class MyMultimap {
 8 public:
 9     multimap<T1, T2,pred > m;
10     typedef typename multimap<T1, T2>::iterator iterator;
11     MyMultimap() {
12         m.clear();
13     }
14     void clear() {
15         m.clear();
16     }
17     void insert(pair<T1, T2> p) {
18         m.insert(make_pair(p.first, p.second));
19     }
20     typename map<T1, T2>::iterator begin() {
21         return m.begin();
22     }
23     typename map<T1, T2>::iterator end() {
24         return m.end();
25     }
26     void Set(T1 key, T2 value) {
27         typename map<T1, T2>::iterator i = m.equal_range(key).first;
28         typename map<T1, T2>::iterator i2 = m.equal_range(key).second;
29         while(i!=i2){
30             i->second=value;
31             i++;
32         }
33     }
34     typename multimap<T1, T2>::iterator find(T1 key){
35         return m.find(key);
36     }
37 };
38 
39 template <typename T1, typename T2>
40 ostream& operator << (ostream& os, pair<T1, T2> i) {
41         os << "(" << i.first << "," << i.second << ")";
42         return os;
43  }
4:编程填空:数据库内的学生信息

 

posted @ 2018-05-20 18:15  咖啡君056  阅读(809)  评论(0编辑  收藏  举报