时间限制1s
内存限制128MB
题目描述
假设某校有20间宿舍,宿舍编号101,102,...,120。每间只住一名学生。初始部分宿舍已用。用两个链表(已用宿舍链表和可用宿舍链表)维护宿舍的管理,实现宿舍分配、宿舍交回。
约定已用宿舍链表按宿舍号升序链接。初始可用宿舍链表也按宿舍号升序链接。
宿舍分配从可用宿舍链表中摘取第一间宿舍分配给学生。学生交回的宿舍挂在可用宿舍链表最后。
备注:使用list容器或静态链表。不用考虑宿舍分配和交回不成功的情况。
输入
初始宿舍状态,第一行输入n,表示已用宿舍n间
后跟n行数据,每行格式为:学生姓名 宿舍号
操作次数m,后跟m行操作,操作格式如下:
assign 学生 //为学生分配宿舍,从可用宿舍链表头摘取一间宿舍,
//按宿舍号升序挂在已用宿舍链表中。
return 宿舍号 //学生退宿舍,删除已用宿舍链表中对应结点,
//挂在可用宿舍链表尾部。
display_free //输出可用宿舍链表信息。
display_used //输出已用宿舍链表信息。
输出
display_free依次输出当前可用宿舍链表中的宿舍号,具体格式见样例。
display_used依次输出当前已用宿舍链表中的宿舍号,具体格式见样例。
#include <iostream>
#include <list>
using namespace std;
struct room{
string name;
int stu_num;
};
bool operator< (const room& r1,const room& r2){//重载运算符,方便使用sort
if (r1.stu_num < r2.stu_num){
return true;
}
return false;
}
typedef list<room> LISTINT;
int main() {
LISTINT used_room;
LISTINT empty_room;
int t;cin>>t;int room[t],no_room[20]={0};
for (int i = 0; i < t; ++i) {
string name;int stu_num;
cin>>name>>stu_num;
room[i]=stu_num;
used_room.push_back({name,stu_num});
}
for (int i = 101; i <= 120; ++i) {
int flag=0;
for (int j = 0; j < t; ++j) {
if(room[j]==i) flag=1;
}
if(flag==0)
empty_room.push_back({"",i});
}
int n;cin>>n;
while(n--){
string control;cin>>control;
if(control=="assign"){
string name;cin>>name;
int roomnum=empty_room.front().stu_num;
empty_room.pop_front();
used_room.push_front({name,roomnum});
}
else if(control=="return"){
int num;cin>>num;
for(auto it=used_room.begin();it!=used_room.end();it++){
if(it->stu_num==num){
used_room.erase(it);
break;
}
}
empty_room.push_back({"",num});
}
else if(control=="display_used"){
LISTINT ::iterator it;
used_room.sort();
for( it = used_room.begin(); it !=used_room.end() ; it++) {
if(it!=used_room.begin())cout<<"-";
cout<<it->name<<"("<<it->stu_num<<")";
}
cout<<endl;
}
else if(control=="display_free"){
LISTINT ::iterator it;
for( it = empty_room.begin(); it !=empty_room.end() ; it++) {
if(it!=empty_room.begin())cout<<"-";
cout<<it->stu_num;
}
cout<<endl;
}
}
}
list使用
包含头文件<list> : #include <list>
List定义和初始化:
list<int>lst1; //创建空list
list<int> lst2(5); //创建含有5个元素的list
list<int>lst3(3,2); //创建含有3个元素的list
list<int>lst4(lst2); //使用lst2初始化lst4
list<int>lst5(lst2.begin(),lst2.end()); //同lst4
创建一个list对象l(注意list是模板类):list<char> l; //堆栈的数据类型是字符型
把一个字符ct添加到链表末尾: s.push_back(ct);
把一个字符ct插入到链表头部: s.push_front(ct);
获取链表第一个元素和最后一个元素:front()和back(),获取链表第一个元素,放入变量c2: c2 = s.front();
删除链表第一个元素和最后一个元素pop_front()和pop_back();
删除某一个节点
list::iterator it; (listname).erase(it)
判断 判断list是否为空:empty(): l.empty(),如果为空则函数返回true,如果不空则返回false
begin() 返回指向第一个元素的迭代器
end() 返回末尾的迭代器
rbegin() 返回指向第一个元素的逆向迭代器
rend() 指向list末尾的逆向迭代器
.sort()给list链表排序
可以通过operator< 重定义sort函数,达到自己自定义排序方式的做法