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;
}