程序设计与算法三九周测验

1:Set

现有一整数集(允许有重复元素),初始为空。我们定义如下操作:
add x 把x加入集合
del x 把集合中所有与x相等的元素删除
ask x 对集合中元素x的情况询问
对每种操作,我们要求进行如下输出。
add 输出操作后集合中x的个数
del 输出操作前集合中x的个数
ask 先输出0或1表示x是否曾被加入集合(0表示不曾加入),再输出当前集合中x的个数,中间用空格格开。

输入

第一行是一个整数n,表示命令数。0<=n<=100000。
后面n行命令,如Description中所述。

输出

共n行,每行按要求输出。

样例输入

7
add 1
add 1
ask 1
ask 2
del 2
del 1
ask 1

样例输出

1
2
1 2
0 0
0
2
1 0
#include<vector>
#include<iostream>
#include<string>
#include<set>
//#include <algorithm> //包含通用算法
using namespace std;
int main() {
	int n;
	cin >> n;
	set<int> v0;
	multiset<int> v;
	set<int>::iterator it;
	string s;
	int x;
	while (n--) {
		cin >> s;
		cin >> x;
		switch (s[2]) {
		case 'd':
			v0.insert(x);
			v.insert(x);
			cout << v.count(x) << endl;
			break;
		case 'k':
			it = v0.find(x);
			if (it != v0.end()) cout << "1 ";
			else cout << "0 ";
			cout << v.count(x) << endl;
			break;
		case 'l':
			cout << v.count(x) << endl;
			v.erase(x);
			break;
		}
	}
}

2:热血格斗场

为了迎接08年的奥运会,让大家更加了解各种格斗运动,facer新开了一家热血格斗场。格斗场实行会员制,但是新来的会员不需要交入会费,而只要同一名老会员打一场表演赛,证明自己的实力。

我们假设格斗的实力可以用一个正整数表示,成为实力值。另外,每个人都有一个唯一的id,也是一个正整数。为了使得比赛更好看,每一个新队员都会选择与他实力最为接近的人比赛,即比赛双方的实力值之差的绝对值越小越好,如果有两个人的实力值与他差别相同,则他会选择比他弱的那个(显然,虐人必被虐好)。

不幸的是,Facer一不小心把比赛记录弄丢了,但是他还保留着会员的注册记录。现在请你帮facer恢复比赛纪录,按照时间顺序依次输出每场比赛双方的id。

输入

第一行一个数n(0 < n <=100000),表示格斗场新来的会员数(不包括facer)。以后n行每一行两个数,按照入会的时间给出会员的id和实力值。一开始,facer就算是会员,id为1,实力值1000000000。输入保证两人的实力值不同。

输出

N行,每行两个数,为每场比赛双方的id,新手的id写在前面。

样例输入

3
2 1
3 3
4 2

样例输出

2 1
3 2
4 2
#include<iostream>
#include<map>
using namespace std;

int main() {
	int n;
	cin >> n;
	map<int, int> v;
	int id,fo,su,sd;
	v.insert(make_pair(1000000000, 1));
	map<int, int>::iterator itu,itd;
	for (int i = 0; i < n; i++) {
		cin >> id >> fo;
		v.insert(make_pair(fo, id));
		itd = v.lower_bound(fo);
		itu = v.upper_bound(fo);
		if (itd == v.begin()) {
			++itd;
			cout << id << " " << itd->second<<endl;
		}
		else if (itu == v.end()) {
			--itd;
			cout << id << " " << itd->second << endl;
		}
		else {
			--itd;
			sd = fo - itd->first;
			su = itu->first - fo;
			if (sd < su) {
				cout << id << " " << itd->second << endl;
			}
			else if (su < sd) {
				cout << id << " " << itu->second << endl;
			}
			else {
				cout << id << " " << itd->second << endl;
			}
		}
	}
	getchar();
	getchar();
}

3:冷血格斗场

为了迎接08年的奥运会,让大家更加了解各种格斗运动,facer新开了一家冷血格斗场。格斗场实行会员制,但是新来的会员不需要交入会费,而只要同一名老会员打一场表演赛,证明自己的实力。

我们假设格斗的实力可以用一个正整数表示,成为实力值,两人的实力值可以相同。另外,每个人都有一个唯一的id,也是一个正整数。为了使得比赛更好看,每一个新队员都会选择与他实力最为接近的人比赛,即比赛双方的实力值之差的绝对值越小越好,如果有多个人的实力值与他差别相同,则他会选择id最小的那个。

不幸的是,Facer一不小心把比赛记录弄丢了,但是他还保留着会员的注册记录。现在请你帮facer恢复比赛纪录,按照时间顺序依次输出每场比赛双方的id。

输入

第一行一个数n(0 < n <=100000),表示格斗场新来的会员数(不包括facer)。以后n行每一行两个数,按照入会的时间给出会员的id和实力值。一开始,facer就算是会员,id为1,实力值1000000000。

输出

N行,每行两个数,为每场比赛双方的id,新手的id写在前面。

样例输入

3
2 3
3 1
4 2

样例输出

2 1
3 2
4 2
#include<iostream>
#include<map>
using namespace std;

////不能直接在上一题基础上修改,不然思路有问题。应该归类为co>1;   co==1;   

int main() {
	int n;
	cin >> n;
	multimap<int, int> v;
	int id, fo,su,sd,co,cou,cod;
	v.insert(make_pair(1000000000, 1));
	multimap<int, int>::iterator it,itu,itd;
	for (int i = 0; i < n; i++) {
		cin >> id >> fo;
		v.insert(make_pair(fo, id));
		itd = v.lower_bound(fo);
		itu = v.upper_bound(fo);
		co = v.count(fo);
		//cout << "co="<<co<<endl;
		if (co > 1) {			
			it = itd;
			for (int i = 1; i < co; ++i) {
				++itd;
				if ((it->second > itd->second) && it->second != id) {
					it = itd;
				}
			}
			cout << id << " " << it->second << endl;
		}
		else {
			if (itd == v.begin()) {
				cou = v.count(itu->first);
				it = itu;
				if (cou > 1) {
					++itu;
					for (int i = 1; i < cou; ++i) {
						if (it->second > itu->second)
							it = itu;
						++itu;
					}
				}
				cout << id << " " << it->second << endl;
			}
			else if (itu == v.end()) {
				--itd;
				it = itd;
				cod = v.count(itd->first);
				if (cod > 1) {
					--itd;
					for (int i = 1; i < cod; ++i) {
						if (it->second > itd->second)
							it = itd;
						--itd;
					}
				}
				cout << id << " " << it->second << endl;
			}
			else {
				su = itu->first - fo;
				--itd;
				sd = fo - itd->first;
				//cout << "su=" << su << "  sd=" << sd;
					if (su < sd) {
					cou = v.count(itu->first);
					it = itu;
					if (cou > 1) {
						++itu;
						for (int i = 1; i < cou; ++i) {
							if (it->second > itu->second)
								it = itu;
							++itu;
						}
					}
					cout << id << " " << it->second << endl;
				}
				else if (sd < su) {					
					it = itd;
					cod = v.count(itd->first);
					if (cod > 1) {
						--itd;
						for (int i = 1; i < cod; ++i) {
							if (it->second > itd->second)
								it = itd;
							--itd;
						}
					}
					cout << id << " " << it->second << endl;
				}
				else {
					cou = v.count(itu->first);
					it = itu;
					if (cou > 1) {
						++itu;
						for (int i = 1; i < cou; ++i) {
							if (it->second > itu->second)
								it = itu;
							++itu;
						}
					}
					cod = v.count(itd->first);
					if (cod == 1) {						
						//cout << it->second << "   itd->second=" << itd->second << endl;
						if (it->second > itd->second)
							it = itd;
					}else {						
						for (int i = 1; i < cod; ++i) {
							if (it->second > itd->second)
								it = itd;
							--itd;
						}
					}
					cout << id << " " << it->second << endl;
				}	
			}
		}
	}
	
}

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

程序填空,使得下面的程序,先输出

(Tom,80),(Tom,70),(Jone,90),(Jack,70),(Alice,100),

(Tom,78),(Tom,78),(Jone,90),(Jack,70),(Alice,100),

(70,Jack),(70,Tom),(80,Tom),(90,Jone),(100,Alice),

(70,Error),(70,Error),(80,Tom),(90,Jone),(100,Alice),

******

然后,再根据输入数据按要求产生输出数据

#include <iostream>
#include <string>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
struct Student 
{
	string name;
	int score;
};
template <class T>
void Print(T first,T last) {
	for(;first!= last; ++ first)
		cout << * first << ",";
	cout << endl;
}
int main()
{
	
	Student s[] = { {"Tom",80},{"Jack",70},
					{"Jone",90},{"Tom",70},{"Alice",100} };
	
	MyMultimap<string,int> mp;
	for(int i = 0; i<5; ++ i)
		mp.insert(make_pair(s[i].name,s[i].score));
	Print(mp.begin(),mp.end()); //按姓名从大到小输出

	mp.Set("Tom",78); //把所有名为"Tom"的学生的成绩都设置为78
	Print(mp.begin(),mp.end());
	
	
	
	MyMultimap<int,string,less<int> > mp2;
	for(int i = 0; i<5; ++ i) 
		mp2.insert(make_pair(s[i].score,s[i].name));
	
	Print(mp2.begin(),mp2.end()); //按成绩从小到大输出
	mp2.Set(70,"Error");          //把所有成绩为70的学生,名字都改为"Error"
	Print(mp2.begin(),mp2.end());
	cout << "******" << endl;
	
	mp.clear();
	
	string name;
	string cmd;
	int score;		
	while(cin >> cmd ) {
		if( cmd == "A") {
			cin >> name >> score;
			if(mp.find(name) != mp.end() ) {
				cout << "erroe" << endl;
			}
			mp.insert(make_pair(name,score));
		}
		else if(cmd == "Q") {
			cin >> name;
			MyMultimap<string,int>::iterator p = mp.find(name);
			if( p!= mp.end()) {
				cout << p->second << endl;
			}
			else {
				cout << "Not Found" << endl; 
			}		
		}
	}
	return 0;
}

输入

输入数据的每一行,格式为以下之一:

A name score
Q name score

name是个不带个空格的字符串,长度小于 20
score是个整数,能用int表示

A name score 表示往数据库中新增一个姓名为name的学生,其分数为score。开始时数据库中一个学生也没有。
Q name 表示在数据库中查询姓名为name的学生的分数


数据保证学生不重名。
输入数据少于200,000行。

输出

对于每个查询,输出学生的分数。如果查不到,则输出 "Not Found"

样例输入

A Tom1 30
A Tom2 40
Q Tom3 
A Tom4 89
Q Tom1
Q Tom2

样例输出

(Tom,80),(Tom,70),(Jone,90),(Jack,70),(Alice,100),
(Tom,78),(Tom,78),(Jone,90),(Jack,70),(Alice,100),
(70,Jack),(70,Tom),(80,Tom),(90,Jone),(100,Alice),
(70,Error),(70,Error),(80,Tom),(90,Jone),(100,Alice),
******
Not Found
30
40

提示

1) 编写模板的时候,连续的两个 “>”最好要用空格分开,以免被编译器看作是 ">>"运算符。VS可能无此问题,但是Dev C++和服务器上的编译环境会有这个问题。
比如 vector<vector<int>> 有可能出错,要改成 vector<vector<int> >

2) 在模板中写迭代器时,最好在前面加上 typename关键字,否则可能会编译错。VS可能无此问题,但是Dev C++和服务器上的编译环境会有这个问题。

/*程序填空,使得下面程序的输出结果是:


(Tom,80),(Tom,70),(Jone,90),(Jack,70),(Alice,100),
(Tom,78),(Tom,78),(Jone,90),(Jack,70),(Alice,100),
(70,Jack),(70,Tom),(80,Tom),(90,Jone),(100,Alice),
(70,Error),(70,Error),(80,Tom),(90,Jone),(100,Alice),

*/
//看着这个代码无比服气。。。然而VS不认



#include <iostream>
#include <string>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
//your code starts here

template <class Key,class T,class Pred = greater<Key> >
class MyMultimap:public multimap<Key,T,Pred> {
	public:
		
		void Set(Key k,T v) {
			typename multimap<Key,T,Pred>::iterator l = 
			multimap<Key,T,Pred>::lower_bound(k);
			typename multimap<Key,T,Pred>::iterator u = 
			multimap<Key,T,Pred>::upper_bound(k);
			for(;l!=u;++l) {
				l->second = v;
			}
		}
};

template <class F,class S>
ostream & operator << (ostream & o,const pair<F,S> & s) {
	o << "(" << s.first  << "," << s.second << ")";
	return o;
}
//your code ends here
struct Student 
{
	string name;
	int score;
};
template <class T>
void Print(T first,T last) {
	for(;first!= last; ++ first)
		cout << * first << ",";
	cout << endl;
}
int main()
{
	
	Student s[] = { {"Tom",80},{"Jack",70},
					{"Jone",90},{"Tom",70},{"Alice",100} };
	
	MyMultimap<string,int> mp;
	for(int i = 0; i<5; ++ i)
		mp.insert(make_pair(s[i].name,s[i].score));
	Print(mp.begin(),mp.end()); //按姓名从大到小输出

	mp.Set("Tom",78); //把所有名为"Tom"的学生的成绩都设置为78
	Print(mp.begin(),mp.end());
	
	
	
	MyMultimap<int,string,less<int> > mp2;
	for(int i = 0; i<5; ++ i)
		mp2.insert(make_pair(s[i].score,s[i].name));
	
	Print(mp2.begin(),mp2.end()); //按成绩从小到大输出
	mp2.Set(70,"Error");          //把所有成绩为70的学生,名字都改为"Error"
	Print(mp2.begin(),mp2.end());
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_31647835/article/details/81429541