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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值