usaco/1.1 Greedy Gift Givers

題目:http://cerberus.delos.com:790/usacoprob2?S=gift1&a=Mwki8qnIJa3


代碼:
/*
ID: chicc991
PROG: gift1
LANG: C++
*/
#include <fstream>
using namespace std;

class person
{
public:
    string name;
    int money ;//原始金錢
    int giftg ;//送給每個人的禮物錢
    int giftr ;//收到的禮物錢
    person():money(0),giftg(0), giftr(0) {};
} person[11] ;


int main()
{
    ifstream fin("gift1.in");
    ofstream fout("gift1.out");
    int per;//總人數
    fin>>per;
    int i;
    string gname;
    string rname;
    for(i=0; i<per; i++)
    {
        fin>>person[i].name;

    }
    int idx;
    for(idx=0; idx<per; idx++)
    {
        fin>>gname;
        for(i=0; i<per; i++)
        {
            if(person[i].name == gname)
            {
                int j;//金錢數
                int k;//需要送禮物的人數
                int m;
                int n;
                fin>>j>>k;
                if(k !=0 && j !=0)
                {
                    person[i].money = j;
                    person[i].giftg = j/k;
                    person[i].giftr +=j-person[i].giftg*k;//非整數部分的錢放入收到做差
                    for(m=0; m<k; m++)
                    {
                        fin>>rname;
                        for(n=0; n<per; n++)
                        {
                            if(person[n].name == rname)
                                person[n].giftr += person[i].giftg;
                        }
                    }
                }

            }
        }
    }
    for(i=0; i<per; i++)
    {
        fout<<person[i].name<<" "<<(person[i].giftr-person[i].money)<<endl;
    }
    fout.close();
    fin.close();

    return 0;
}

1.C++中類的成員變量不能直接初始化,詳見:http://www.9cpp.com/c-class-constructor-initialization-list/
不得不吐槽,太不方便了

2.不知oj是用的什麼編譯的,‘\0'不識別。

3.C++用new和不用new創建對象的區別,詳見:http://blog.163.com/zhuandi_h/blog/static/18027028820129169538815/

4.效率問題,此時時間複雜度爲O(n^4)
如果採用map實現,時間複雜度可以降爲O(n^2)
#include<iostream>
#include<fstream>
#include<string>
#include<map>
using namespace std;
int main()
{
	string names[50];
	map <string,int> reci,given;	
	int np;
	ifstream cin("gift1.in");
	ofstream cout("gift1.out");	
	cin>>np;
	for (int i=1;i<=np;i++)
		cin>>names[i];
	for (int i=1;i<=np;i++)
	{
		string temp;
		int tempr,tempg,j;		
		cin>>temp;
		cin>>tempg>>j;
		for (int k=1;k<=j;k++)
		{
			string temp2;			
			cin>>temp2;
			reci[temp2]+=tempg/j;
			given[temp]+=tempg/j;
		}	
	}
	for (int i=1;i<=np;i++)
		cout<<names[i]<<" "<<reci[names[i]]-given[names[i]]<<endl;
	return 0;
 
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章