uva230总是wronganwser,不知道为什么?
问题描述:
我在刷uva230遇到的问题,代码在本地测试都没问题,但是一提交就是WrongAnswer,不知道问题具体出在哪,求大神指点迷津。不要网上的代码,希望大神能帮忙找出我代码的错误。
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<string>
#include<iterator>
using namespace std;
struct bookList {
string bookName;
string author;
};
bool cmp(bookList l, bookList r) {
if (l.author == r.author)return l.bookName < r.bookName;
else return l.author < r.author;
}
string bookName;
string author;
string temp;
bookList L1[10000];
map<string, int> bookNum;
vector<int> bookShelves;
int n = 0;
void T5_8() {
while (cin >> temp) {
bookName.clear();
author.clear();
if (temp == "END")break;
bookName += temp;
while (cin >> temp&&temp != "by") {
bookName += " ";
bookName += temp;
}
getline(cin, author);
L1[n].bookName = bookName;
L1[n].author = author;
n++;
}
//排序
sort(L1, L1 + n, cmp);
//赋予编号,并把图书上架
for (int i = 0; i < n; i++) {
bookNum[L1[i].bookName] = i;
bookShelves.push_back(i);
}
vector<int> books;
//处理输入;
while (cin >> temp) {
if (temp[0] == 'B') {
getchar();//吃掉空格
getline(cin, bookName);
vector<int>::iterator it = find(bookShelves.begin(), bookShelves.end(), bookNum[bookName]);
bookShelves.erase(it);
}
else if (temp[0] == 'R') {
getchar();//吃掉空格
getline(cin, bookName);
books.push_back(bookNum[bookName]);
}
else if (temp[0] == 'S') {
sort(books.begin(), books.end());//先排序
while (!books.empty()) {
int bookNumber = books.front();
vector<int>::iterator it = books.begin();
books.erase(it);
if (bookShelves.empty()) {
bookShelves.push_back(bookNumber);
cout << "Put ";
cout << L1[bookNumber].bookName;
cout << " first\n";
}
else {
int toFind = bookNumber;//把这个插入到num比他小的最大的数的后面
int insertMax = -1;
for (int i = 0; i < bookShelves.size(); i++) {
if (bookShelves[i] < toFind) {
if (insertMax<bookShelves[i])
insertMax = bookShelves[i];
}
else break;
}
if (insertMax == -1) {//放在最前面
cout << "Put ";
cout << L1[bookNumber].bookName;
cout << " first\n";
}
else {
cout << "Put ";
cout << L1[toFind].bookName;
cout << " after ";
cout << L1[insertMax].bookName;
cout << "\n";
//cout << "Put " << L1[toFind].bookName << " after " << L1[insertWho].bookName << endl;
}
bookShelves.insert(find(bookShelves.begin(), bookShelves.end(), insertMax), toFind);
}
}
cout << "END" << endl;
}
else { break; }
}
}
int main() {
T5_8();
}
答
问题所在:
# 1、对于这种含有空格的字符串输入,用getline读入,因为输入数据中,并没有明确单词与单词之间只有一个空格,你这种处理输入的方式不对****
# 2、bookList L1[10000]; 这个需要改成 vector L1; 你这里调用了vector的相关操作
3、你最后在更新书架上的书的时候,应该分开处理,当insertMax为-1时,应该单独写一个在开始位置插入该书的编号,因为你在vector中无法找到位置为-1的。
# 3、修改后的程序代码如下: (以后有什么问题可以直接问我哦!)**_**
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct bookList {
string bookName;
string author;
};
bool cmp(bookList &l, bookList &r) {
if (l.author == r.author)
return l.bookName < r.bookName;
else
return l.author < r.author;
}
string bookName;
string author;
string temp;
//bookList L1[10000];
vector L1;
map bookNum;//书名和编号对应
vector bookShelves;
int n = 0;
void T5_8() {
while(getline(cin,temp)&&(temp!="END")) { //读取每一行
int pos = temp.rfind('"'); //从字符串的尾部往前找到第一个"
bookList l1;
l1.bookName = temp.substr(0, pos + 1);
l1.author = temp.substr(pos + 5);
// cout << n << ":[" << l1.bookName << "],[" << l1.author << "]" << endl;
n++;
L1.push_back(l1);
}
//排序
sort(L1.begin(), L1.end(), cmp);
//赋予编号,并把图书上架
for (int i = 0; i < n; i++) {
// cout << i << ":[" << L1[i].bookName << "],[" << L1[i].author << "]" << endl;
bookNum[L1[i].bookName] = i;
bookShelves.push_back(i);
}
vector books;
//处理输入;
while (cin >> temp) {
if (temp[0] == 'B') {
getchar();
getline(cin, bookName);
bookShelves.erase(find(bookShelves.begin(), bookShelves.end(), bookNum[bookName]));
} else if (temp[0] == 'R') {
getchar();//吃掉空格
getline(cin, bookName);
books.push_back(bookNum[bookName]);
} else if (temp[0] == 'S') {
sort(books.begin(), books.end());//先排序
while (!books.empty()) {
int bookNumber = books.front();
vector::iterator it = books.begin();
books.erase(it);
int toFind = bookNumber;//把这个插入到num比他小的最大的数的后面
int insertMax = -1;
for (int i = 0; i < bookShelves.size(); i++) {
if (bookShelves[i] < toFind) {
if (insertMax<bookShelves[i])
insertMax = bookShelves[i];
} else
break;
}
if (insertMax == -1) { //放在最前面
cout << "Put " << L1[bookNumber].bookName << " first" << endl;
bookShelves.insert(bookShelves.begin(),toFind);
} else {
cout << "Put " << L1[toFind].bookName << " after " << L1[insertMax].bookName << endl;
//当是这里,如果是第一本书,本应该插入在第一个位置,这里会查找不到,插入在最后一个位置
bookShelves.insert(find(bookShelves.begin(), bookShelves.end(), insertMax) + 1, toFind);
}
}
cout << "END" << endl;
} else {
break;
}
}
}
int main() {
T5_8();
}
答
https://blog.csdn.net/a197p/article/details/43747539
https://blog.csdn.net/dongchengrong/article/details/72799516
先找人家的程序,看看行不行,如果还不行,就是环境的问题。否则检查你的程序