1. 程式人生 > >UVA-230《演算法競賽入門經典》

UVA-230《演算法競賽入門經典》

題目大意:

模擬圖書管理系統,首先輸入若干圖書的標題和作者(標題各不相同,以END結束),然後是若干指令:borrow指令表示借書,return指令表示還書,shelve指令表示把所以已歸還但還沒有上架的圖書排序後插入書架並輸入圖書標題和插入位置(可能是第一本書或者某本書的後面),圖書排序的方法是先按作者從小到大排序,再按標題從小到大排序。在處理第一條指令前,應當先將所有圖書按照這種方式排序。

解題思路:

本題是《演算法競賽入門經典》第五章c++與STL的課後題,所以我當然首先想如何需要用什麼STL容器去解決問題,經過思考和參考網上的解題思路之後,我決定使用map對圖書的狀態進行模擬,再使用vector對結構體book進行儲存,節省儲存空間。

 選擇好用什麼容器之後,問題就集中到了如何處理輸入字串還有如何在shelve的時候找到應該插入的位置。對於輸入字串的處理,我參考了別的pong友的思路,先用string的find函式找到第二個雙引號的位置,然後用substr擷取。對於如何找到應該插入的位置,應該從該書排序之後的序號,通過map開始向前查詢,找到的第一個在架的書,然後插到後面,若前面已經沒有書了,那就放在第一個。

遇到問題:

WA了多次,很無奈。對了accpted output,發現是輸出格式首字母沒有大寫,MMP。。。

感悟:

第一次寫部落格,不足之處請見諒。                                                                

程式碼:

#include<iostream>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<algorithm> 

using namespace std;

struct Book
{
	string title;
	string author;
	Book(string n,string a){
		title = n;
		author = a;
	}
	bool operator< (const Book b){
		if(this->author == b.author)
			return this->title < b.title;
		return this->author < b.author;
	}
};

map<string,int> value;//存放圖書當前狀態1:在架,2:歸還未上架,0:借出
vector<Book> books;//用於儲存圖書 

int main()
{
//	freopen("input.txt","r",stdin);
//	freopen("output.txt","w",stdout);
	string s,title,author;
	while(getline(cin,s) && s != "END")
	{
		int pos = s.find('\"',1);
		title = s.substr(1,pos);
		pos += 5;
		author = s.substr(pos);
		Book b = Book(title,author);
		books.push_back(b);
		value[title] = 1;
	}
	sort(books.begin(),books.end());//對書進行升序排序 
	while(getline(cin,s) && s != "END")
	{
		if(s[0] == 'B')
		{
			title = s.substr(8);
			value[title] = 0;//書借走之後要將標記記為0 
		}
		else if(s[0] == 'R')
		{
			title = s.substr(8);
			value[title] = 2;//歸還未上架的書記為2 
		} 
		else
		{
			for(int i = 0 ; i < books.size() ; i++)
			{
				if(value[books[i].title] == 2)
				{
					int j;
					for(j = i-1 ; j >= 0 ;j--)//找到當前第i本書應該插入的位置j 
					{
						if(value[books[j].title] == 1)
							break;
					}
					cout << "Put \""<<books[i].title<<" ";
					if(j != -1)
						cout << "after \"" <<books[j].title <<endl;
					else
				 	 	cout << "first" <<endl;
					value[books[i].title] = 1;
				}
			}
			cout << "END\n";
		} 
	}
	return 0;
}