我最近在 USACO 在线培训计划注册,我目前正在处理问题 2。我已经完成了编码并且一切都正确编译。但是当我提交代码时,我不断收到以下错误:
运行 1:执行错误:您的程序出现此运行时错误:打开了非法文件 (/dev/tty)。程序在出错前运行了 0.011 CPU 秒。它使用了 3348 KB 的内存。
我试图寻找问题是徒劳的。但是,我认为这是一个内存管理问题,因为我使用了指针向量。在 USACO 常见问题解答中,他们说:
运行我们的评分系统的 Linux 在内存访问方面比 Windows 更加挑剔。因此,Windows 上允许的无效数组索引和错误指针取消引用可能会导致您的程序在 Linux 下崩溃。或者,它们会破坏内部数据结构并给出最神秘的错误消息,例如“无法打开 /dev/[mumble]”。
这是代码:
/*
ID: freebie1
PROG: gift1
LANG: C++
*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;
class Person {
public:
Person():m_volatile(0) {}
void setName(string name) { m_name = name; }
string getName() { return m_name; }
void setMoney(int money){ m_sMoney = money; }
int getMoney() { return m_volatile; }
void receive(int money) { m_volatile += money; }
void giveGifts(vector<Person*> fTab){
int splitMoney = m_sMoney/fTab.size();
for(vector<Person*>::iterator it=fTab.begin();it!=fTab.end();it++) {
(*it)->receive(splitMoney);
}
m_volatile-=splitMoney*fTab.size();
}
private:
string m_name;
int m_sMoney; // starting money
int m_volatile;
};
.
class FindFriend {
public:
FindFriend(string query):m_query(query){}
bool operator()(Person &individu){
if(individu.getName()==m_query) { return true; }
else { return false; }
}
private:
string m_query;
};
vector<Person*> setFriends(vector<string> &namesTab,vector<Person> &personsTab){
vector<Person*> tab;
for(vector<string>::iterator it=namesTab.begin();it!=namesTab.end();it++) {
FindFriend f(*it);
vector<Person>::iterator trouve=find_if(personsTab.begin(),personsTab.end(),f);
tab.push_back(&*trouve);
}
return tab;
}
int main() {
ofstream fout("gift1.out");
ifstream fin("gift1.in");
if(fin) {
int np(0);
fin>>np; // Number of persons
// Each one is assigned a name...
vector<Person> personsTab(np);
for(vector<Person>::iterator it=personsTab.begin();it!=personsTab.end();it++){
string namePerson;
fin>>namePerson;
it->setName(namePerson);
}
// ...money and the friends we'll give the money to
while(!fin.eof()){
string name;
int money(0),nFriends(0);
fin>>name;
FindFriend g(name);
vector<Person>::iterator trouve=find_if(personsTab.begin(),personsTab.end(),g);
fin>>money>>nFriends;
trouve->setMoney(money); // Somme de depart
// Amis
if(nFriends!=0 || money!=0) {
vector<string> friendsTab;
for(int i(0);i<nFriends;i++) {
string chaine;
fin>>chaine;
friendsTab.push_back(chaine);
}
// We create a vector of pointers to his friends
vector<Person*> pFriends(nFriends);
pFriends=setFriends(friendsTab,personsTab);
trouve->giveGifts(pFriends); // Each person share the money among his friends
}
}
// We output the net loss/profit for each one
for(vector<Person>::iterator it=personsTab.begin();it!=personsTab.end();it++) {
string name=it->getName();
int money=it->getMoney();
fout<<name<<" "<<money<<endl;
}
}
return 0;
}
这是输入文件gift1.in
5
dave
laura
owen
vick
amr
dave
200 3
laura
owen
vick
owen
500 1
dave
amr
150 2
vick
owen
laura
0 2
amr
vick
vick
0 0