UVA 230 Borrowers (STL 行读入的处理 重载小于号)

题意:

输入若干书籍和作者名字,然后先按作者名字升序排列,再按标题升序排列,然后会有3种指令,BORROW,RETURN, SHELVE。

BORROW 和 RETURN 都会带有一个书名在后面,如:

BORROW "The Canterbury Tales"
RETURN "The Canterbury Tales"

当遇到SHELVE指令,输出已还但没上架的书排序后(规则同上)依次插入书架的序列。

用例:

输入:

"The Canterbury Tales" by Chaucer, G.
"Algorithms" by Sedgewick, R.
"The C Programming Language" by Kernighan, B. and Ritchie, D.
END
BORROW "The Canterbury Tales"
RETURN "The Canterbury Tales"
BORROW "The C Programming Language"
RETURN "The C Programming Language"
SHELVE
BORROW "Algorithms"
RETURN "Algorithms"
SHELVE
END

输出:

Put "The Canterbury Tales" first
Put "The C Programming Language" after "The Canterbury Tales"
END
Put "Algorithms" after "The C Programming Language"
END

分析:

这题的读入有点麻烦,我的处理是使用getline, 然后将 “ 号变成空格 将空格变成“#”(ASCII差距不大), 再用stringsteam输入到string中,最后输出再将“#”转换为“ ”。

网上的方法是使用string.substr()截取,用string.find()去寻找位置, 我截取这种方法更好(stringsteam很慢)。

用map<string,int>将string映射到书架位置上面,用一个bool去标记这个位置有没被拿走,注意return后不能直接把书放回去,要标记,等收到SHELVE指令再排序放书。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <vector>
  4 #include <map>
  5 #include <string>
  6 #include <iostream>
  7 #include <set>
  8 #include <sstream>
  9 #include <algorithm>
 10 using namespace std;
 11 struct B
 12 {
 13     string name;
 14     string author;
 15     B(){}
 16     B(const string& _name,const string& _author):
 17         name(_name),author(_author){}
 18     friend bool operator < (const B a,const B b)
 19     {
 20         if(a.author < b.author) return true;
 21         else
 22         {
 23             if(a.author == b.author)
 24             {
 25                 if(a.name < b.name)
 26                     return true;
 27                 else return false;
 28             }
 29             else return false;
 30         }
 31     }
 32 };
 33 struct A
 34 {
 35     int a;
 36     int b;
 37     A(){}
 38     A(int _a, int _b):
 39         a(_a), b(_b){}
 40 //    a after b of a is the first(b=-1);
 41 };
 42 typedef set<B> :: iterator sIT;
 43 typedef vector<B> :: iterator vIT;
 44 typedef vector<A> :: iterator aIT;
 45 typedef vector<int> :: iterator IT;
 46 string trans(const string& a)
 47 {
 48     string t = a;
 49     for(int i = 0; i < t.size(); i++)
 50     {
 51         if(t[i] == ‘#‘) t[i] = ‘ ‘;
 52     }
 53     return t;
 54 }
 55 int main()
 56 {
 57     ios::sync_with_stdio(false);
 58     #if LOCAL
 59     freopen("1.txt","r",stdin);
 60     freopen("2.txt","w",stdout);
 61     #endif // LOCAL
 62     string s;
 63     vector<B> book;
 64     bool lend[1005];
 65     vector<A> ans;
 66     fill(lend, lend+1005,1);
 67     map<string,int> id;
 68     vector<int> ret;
 69     while(getline(cin,s))
 70     {
 71         for(int i = 0; i < s.size(); i++)
 72         {
 73             if(s[i] == ‘"‘) s[i] = ‘ ‘;
 74             else if(s[i] == ‘ ‘) s[i] = ‘#‘;
 75         }
 76         stringstream ss(s);
 77         string tname, tauthor;
 78         if(!(ss>>tname>>tauthor)) break;
 79         book.push_back(B(tname,tauthor));
 80     }
 81     sort(book.begin(), book.end());
 82     int cnt = 0;
 83     for(vIT it = book.begin(); it != book.end(); it++)
 84     {
 85         id[(*it).name] = cnt++;
 86     }
 87     string op;
 88     while(cin>>op)
 89     {
 90         if(op=="END") break;
 91         if(op == "SHELVE")
 92         {
 93             sort(ret.begin(), ret.end());
 94             for(IT it = ret.begin(); it != ret.end(); it++)
 95             {
 96                 lend[*it] = 1;
 97                 int c = (*it) -1;
 98                 for(; c >= 0 && lend[c] == 0; c--);
 99                 ans.push_back(A(*it,c));
100             }
101             ret.clear();
102             for(aIT it = ans.begin(); it != ans.end(); it++)
103             {
104                 if((*it).b != -1)
105                 {
106                     cout<<"Put \""<< trans(book[(*it).a].name) << "\" after \"" << trans(book[(*it).b].name) << "\"\n";
107
108                 }
109                 else
110                 {
111                     cout<<"Put \""<<trans(book[(*it).a].name)<< "\" first"<<"\n";
112
113                 }
114             }
115             ans.clear();
116             cout<<"END\n";
117             continue;
118         }
119         cin.ignore();
120         string b;
121         getline(cin,b);
122         for(int i = 0; i < b.size(); i++)
123         {
124             if(b[i] == ‘"‘) b[i] = ‘ ‘;
125             else if(b[i] == ‘ ‘) b[i] = ‘#‘;
126         }
127         stringstream ss(b);
128         ss>>b;
129         if(op== "BORROW")
130         {
131             lend[id[b]] = 0;
132         }
133         else if(op == "RETURN")
134         {
135
136             ret.push_back(id[b]);
137         }
138     }
139
140
141     return 0;
142 }
时间: 2024-11-29 08:18:17

UVA 230 Borrowers (STL 行读入的处理 重载小于号)的相关文章

uva 230 Borrowers(摘)&lt;vector&gt;&quot;结构体“ 膜拜!

I mean your borrowers of books--those mutilators of collections, spoilers of the symmetry of shelves, and creators of odd volumes. --Charles Lamb, Essays of Elia (1823) 'The Two Races of Men' Like Mr. Lamb, librarians have their problems with borrowe

UVA 230 Borrowers(vector和map的应用,模拟)

1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<queue> 4 #include<algorithm> 5 #include<cstring> 6 #include<string> 7 #include<iostream> 8 using namespace std; 9 typedef long long ll; 10 /** 11 题意:SHELVE

【UVA】230 - Borrowers(map模拟)

利用map<string,int>判断一本书的状态,0代表借出去了,1代表在书架,2代表借出去换回来但是还未放回书架 设计一些字符串的处理问题,用一些字符串搜索函数比如 strstr , strchar等等 14072706 230 Borrowers Accepted C++ 0.015 2014-08-21 02:59:27 AC代码: #include<cstdio> #include<cstring> #include<iostream> #incl

Java-map-第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。 附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录

第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年份,请参考本章附录. 附录 历届世界杯冠军 届数 举办年份 举办地点 冠军 第一届 1930年 乌拉圭 乌拉圭 第二届 1934年 意大利 意大利 第三届 1938年 法国 意大利 第四届 1950年 巴西 乌拉圭 第五届 1954年 瑞士 西德 第六届 1958年 瑞典 巴西 第七届 1962年

Java练习题_Map 利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。

从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队. 历届世界杯冠军 届数 举办年份 举办地点 冠军 第一届 1930年 乌拉圭 乌拉圭 第二届 1934年 意大利 意大利 第三届 1938年 法国 意大利 第四届 1950年 巴西 乌拉圭 第五届 1954年 瑞士 西德 第六届 1958年 瑞典 巴西 第七届 1962年 智利 巴西 第八届 1966年 英格兰 英格兰 第九届 1970年 墨西哥 巴西 第十届 1974年 前西德 西德 第十一届 1978年 阿根廷 阿根廷 第

C/C++如何整行读入字符串?

在写代码的过程中,经常要一行一行的读入字符串进行处理,这里我总结了一些方法,供大家参考. 方法一:scanf()读入char[] 使用方法: char str[1024]; scanf("%[^\n]",&str); getchar(); 说明:在scanf函数中,可以使用%c来读取一个字符,使用%s读取一个字符串, 但是读取字符串时不忽略空格,读字符串时忽略开始的空格,并且读到空格为止,因此只能读取一个单词,而不是整行字符串. 其实scanf函数也可完成这样的功能,而且还更强

UVa - 1592 Database(STL综合,强推!)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51293 #include <iostream> #include <map> #include <vector> #include <string> #include <cstdio> #include <cstring> #define MAXN 10005 #define MAXM 15 using

从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。

附:世界杯冠军以及对应的夺冠年份,请参考本章附录. 附录 历届世界杯冠军 届数 举办年份 举办地点 冠军 第一届 1930年 乌拉圭 乌拉圭 第二届 1934年 意大利 意大利 第三届 1938年 法国 意大利 第四届 1950年 巴西 乌拉圭 第五届 1954年 瑞士 西德 第六届 1958年 瑞典 巴西 第七届 1962年 智利 巴西 第八届 1966年 英格兰 英格兰 第九届 1970年 墨西哥 巴西 第十届 1974年 前西德 西德 第十一届 1978年 阿根廷 阿根廷 第十二届 198

for循环参数列表通过命令行读入

 1 #通过命令行来传递脚本中for循环列表参数   2 #!/bin/bash   3    4 echo "number of arguments is $#"   5    6 echo "What you input is "   7    8 #通过命令行来传递脚本for循环的参数列表   9 for argument in "$*"  10 do   11     echo "$argument"  12 done