UVA 119.Greedy Gift Givers

题意:每个人的钱尽可能多的花掉,剩下的当做自己的收入.题目求得是每个人的纯收入,即1.从朋友那里得到的加上自己剩余的.2.如果朋友为0(没有送给任何人),则这部分钱不算自己的收入.

注意:每个输入组的数据要用一个空行隔开,但是不能单纯的在每组数据输入之后才打印空行,要在除了第一组之前答应空行.

#include 
#include 
#include 
#include 
using namespace std; 


struct Node 
{ 
	string name; 
    int give; 
    int rest; 
    int friends;//朋友数量 
    int friends_num[100];//保存朋友的下标 
}; 
   
int main() 
{ 
	int num;
	bool flag = false;
	while(cin >> num)
	{
		if(flag)
			cout << endl;
		else
			flag = true;
		
		int i,j,k,m; 
		Node person[10]; 
		string name; 
  
		for(i = 0;i < num;i++) 
		{ 
			cin >> person[i].name; 
		} 


		for(i = 0;i < num;i++) 
		{ 
			cin >> name; 


			for(j = 0;j < num;j++) 
			{ 
				if(name == person[j].name) 
				{ 
					cin >> person[j].give; 
					cin >> person[j].friends;
					break; 
				} 
			} 


			for(m = 0;m < person[j].friends;m++) 
			{ 
				cin >> name; 
				for(k = 0;k < num;k++) 
				{ 
					if (name == person[k].name)  
					{
						person[j].friends_num[m] = k;
						break;
					} 
				} 
			} 


		} 


		for(i = 0;i < num;i++)   
		{
			if(person[i].friends == 0)
			{
				person[i].rest = 0;
			}
			else
			{
				person[i].rest = person[i].give % person[i].friends;
			}
		} 


		for(i = 0;i < num;i++)   
		{   
			if(person[i].friends)   
			{ 
				for(j = 0;j < person[i].friends;j++) 
				{ 
					person[person[i].friends_num[j]].rest += (person[i].give / person[i].friends); 
				} 
			} 
		} 

		for(i = 0;i < num;i++) 
		{ 
			if(person[i].friends == 0)
			{
				cout << person[i].name <<" "<< person[i].rest << endl; 
			}
			else
			{
				cout << person[i].name <<" "<< person[i].rest - person[i].give << endl;
			}  
		}


	}
   return 0; 
}


你可能感兴趣的:(ACM)