C++_USACO_从文件读出各类数据_Greedy Gift Givers
/* TASK:gift1 LANG:C++ */ #include<iostream> #include<fstream> #include<string> using namespace std; class Person{ private: string name; int rec; int give; public: Person(){ this->rec=0; this->give=0; } string getName(){ return this->name; } int getRev(){ return this->rec; } int getGive(){ return this->give; } void setName(string name){ this->name=name; } void setRev(int rec){ this->rec=rec; } void setGive(int give){ this->give=give; } }; int main(){ ifstream fin("gift1.in"); ofstream fout("gift1.out"); Person persons[10]; int nums; string name; string giver_name; string rec_name; int give_total; int give_num; int rem; int average; int subtract; int final; fin>>nums; for(int i=0;i<nums;i++){ fin>>name; persons[i].setName(name); } for(int i=0;i<nums;i++){ fin>>giver_name; fin>>give_total>>give_num; if(give_total!=0){ rem=give_total%give_num; if(rem==0){ average=give_total/give_num; subtract=give_total; } else{ average=(give_total-rem)/give_num; subtract=give_total-rem; } for(int j=0;j<give_num;j++){ fin>>rec_name; for(int k=0;k<nums;k++){ if((persons[k].getName().compare(rec_name))==0) persons[k].setRev(persons[k].getRev()+average); } } for(int k=0;k<nums;k++){ if((persons[k].getName().compare(giver_name))==0) persons[k].setGive(persons[k].getGive()+subtract); } } else{ for(int j=0;j<give_num;j++) fin>>rec_name; } } for(int i=0;i<nums;i++){ final=persons[i].getRev()-persons[i].getGive(); fout<<persons[i].getName()<<" "<<final<<endl; } return 0; }
学习人家的:用vector<string>存储几个人的名字,map<string,int>people来将每一个名字对应的钱数映射到一起。而且比如,我们不用求总钱数与总人数的余数,看是否为0.而是直接除以之后,不管有没有余数,总人数*每个人分得的钱数就是给予者该减去的钱数。另外,从文件获取数据时,可以多行获取,像此题中连续获取三行的内容比较不会乱。这些小地方应该学习哦
#include <fstream> #include <string> #include <vector> #include <map> using namespace std; int main() { ifstream fin("gift1.in"); ofstream fout("gift1.out"); int n; fin >> n; vector<string> givers; string name; for (int i = 0; i < n; ++i) { fin >> name; givers.push_back(name); } map<string, int> people; int money, gift, people_num; string giver, reciever; for (int i = 0; i < n; ++i) { fin >> giver >> money >> people_num; if (money == 0 || people_num == 0) continue; gift = money / people_num; for (int j = 0; j < people_num; ++j) { fin >> reciever; people[reciever] += gift; } people[giver] -= gift * people_num; } for (vector<string>::iterator iter = givers.begin(); iter != givers.end(); ++iter) { fout << *iter << " " << people[*iter] << "\n"; } return 0; }