UVA - 230 - Borrowers

原命题链接:PDF/Vjudge

题目中的意思是,模拟一个借还书的系统,告诉使用者书的摆放顺序:

———— 优先按照书的作者排序,否则按照书籍标题排序。

可以给每一个书籍建立一个struct,储存书籍标题,书籍作者。

(在结构体里重新定义了小于号“<”,便于sort排序)

首先在map中,保存书籍的在馆信息,负值表示需要归还,0表示未被归还,正数代表书籍的序列号,同时在馆。

#include 

using namespace std;

map word;

struct book {
	string title;
	string author;
	bool operator < (const struct book & change)
	{
		if (author == change.author)
			return (title < change.title);
		else
			return author < change.author;
	}
}bk[5000];

int main()
{
	//freopen("t.txt", "w", stdout);
	string line;
	int i = 0;
	while (getline(cin, line))
	{
		if (line == "END")
			break;
		string x, y;
		x = line.substr(0, line.find_last_of("\"") + 1);//copy
		y = line.substr(line.find_last_of("\"") + 5);//copy
		bk[i].title = x;
		bk[i++].author = y;
	}
	sort(bk, bk + i);
	for (int j = 0; j < i; j++)
	{
		word[bk[j].title] = j + 1;
		//cout << bk[j].title<> s)
	{
		if (s == "END")
			break;
		if (s == "BORROW")
		{
			getchar();//吃掉中间的一个空格符
			getline(cin, temp);
			word[temp] = 0;
		}
		if (s == "RETURN")
		{
			getchar();
			getline(cin, temp);
			word[temp] = -1;
		}
		if (s == "SHELVE")
		{
			for (int j = 0; j < i; j++)
			{
				if (word[bk[j].title] == -1)
				{
					if (j == 0)
					{
						cout << "Put " << bk[j].title << " first" << endl;
					}
					else
					{
						int k = j - 1;
						while (word[bk[k].title] == 0)
						{
							k--;
							if (k < 0)
								break;
						}
						if (k < 0)
							cout << "Put " << bk[j].title << " first" << endl;
						else
							cout << "Put " << bk[j].title << " after " << bk[k].title << endl;
					}
					word[bk[j].title] = j + 1;
				}
			}
			cout << "END" << endl;
		}
	}
	//system("pause");
	return 0;
}

新东西

1.使用string的substr来取某一段复制,返回值是一个新的string,两个参数,起始位置,结束位置(省缺为str.size())。

2.使用find来找到需要分割的地方,find_last_of("char"),找到最后一个出现char的地方,返回一个数值,若没有,返回负数。

对于输出:

输出的时候,对第一本需要归还单独处理,其余的,对于一本需要归还的书,查找他前面一个未在读者手中的书籍,如果找到,就把这本书放在已经存在的书籍的下面,否则的话,k应该返回一个负数,这个时候,表示没有满足条件的书籍,直接先放他就行了。

最后不要忘记更改图书的在馆信息,保证后来的书放置的时候,找得到他。


你可能感兴趣的:(UVA)