UVA-230 Borrowers 题解

最近帮学习者解决了UVA 230的题解,说说我的几点看法
题意:输入几本书的信息,包括书名、作者名 以“END”结束;然后再输入操作信息,有“BORROW" ,“RETURN”,"SHELVE”分别表示借、环、上架,以“END”结束。对于每一个"SHELVE”操作,按照题目要求输出归还的书应该放在哪个位置,要求按照先作者后书名的升序顺序进行输出,并输出“END”。
总的来说,这道题简单,不涉及算法,模拟题。
解题思路:
(1)处理书的信息
将每本书的书名和作者存储起来,这种情况,一般采用结构体数组;这里对字符串的输入处理强调一下:对于这种有空格的字符序列输入,建议用getline输入,避免多空格存在的情况(题意并没有明确字符串之间只有一个空格),然后用字符串的操作函数取出书名和作者名的字符串;
(2)处理书的排列顺序
由于题目要求按照先作者后书名的升序顺序进行输出,因此,我们可以事先对书的结构体按照这种方式进行排序,这不会影响结果。这里就涉及到结构体排序,需要重写cmp函数。
(3)处理书的状态
初始状态时,每本书都在书架上。根据输入的操作信息来修改书的状态,修改后的书的状态分为三种:在书架上,借走、归还但是还没有上架(特别注意)。对于这点处理的方式很多,可以在书的结构体中增加一个state状态成员,在操作中对它进行修改,一定要注意归还后的书要改变状态;也可以用一个vector数组存储正在书架上的书,如果书被借走,我就erase;如果上架,我就insert,但是这种操作一定要注意第一个元素的特殊处理。
整个思路就是这样,对于这种OJ上的题,对输出格式的要求很高,如果在这方面比较弱的道友可以先学一学输入输出专题!

为了便于道友们向我咨询问题,特意开设了一个免费的知识星球——CaptianXue,星球提供学习、理财、生活、职场等各类文章和免费答疑!!
在这里插入图片描述)
现在直接上代码:

#include<iostream>
#include<queue>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
struct  libr {
	string title;//书名
	string author;//作者
} book[1000];
map<string,string>book_state;//由于书名不会相同,所以书名和书的状态对应。
bool cmp(libr &a,libr &b) {
	if(a.author.compare(b.author)==0) {
		return a.title<b.title;//如果作者一样,则按照标题从小到大排序
	} else {
		return a.author<b.author;
	}
}
int main() {
	string s;
	int no=0;//因为sort是从0开始的,所以要对应
	int i,j;
	while(getline(cin,s)&&(s!="END")) { //读取每一行
		int pos = s.rfind('"'); //从字符串的尾部往前找到第一个"
		book[no].title = s.substr(0, pos + 1);
		book[no].author = s.substr(pos + 5);
		no++;
	}
	sort(book,book+no,cmp);//结构体进行排序
	for(i=0; i<no; i++) {
		book_state[book[i].title]="SHELVE";//初始化所有的书的状态,表示都在架子上。
	}
	string str;
	string st1,st2;
	while((cin>>str)&&(str!="END")) {
		if(str=="BORROW") {
			getchar();//去除空格
			getline(cin,st1);
			book_state[st1]="BORROW";
		} else if(str=="RETURN") {
			getchar();
			getline(cin,st2);
			book_state[st2]="RETURN";
		} else if(str=="SHELVE") {
			for(i=0; i<no; i++) {
				if(book_state[book[i].title]=="RETURN") { //注意归还后要改变其状态。
					book_state[book[i].title]="SHELVE";//注意这里是=不是==
					int index=-1;//定位
					if(i==0) {
						index=-1;
					} else {
						for(j=i-1; j>=0; j--) {
							if(book_state[book[j].title]=="SHELVE") {
								index=j;//找到合适的位置。
								break;
							}
						}
					}
					if(index==-1)
						cout<<"Put "<<book[i].title<<" first"<<endl;
					else
						cout<<"Put "<<book[i].title<<" after "<<book[index].title<<endl;
				}
			}

			cout<<"END"<<endl;
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值