程序设计与算法第九周测验(2018春季)
Posted bupt-coffee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序设计与算法第九周测验(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 }
【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 }
【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 }
【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 }
以上是关于程序设计与算法第九周测验(2018春季)的主要内容,如果未能解决你的问题,请参考以下文章
20172322 2017-2018-2 《程序设计与数据结构》第九周学习总结
华中农业大学2021年春季学期软件工程B课程HZAU_plugin小组第九周汇报