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;
}

 

posted @ 2013-07-13 20:44  开心成长  阅读(305)  评论(0编辑  收藏  举报