您的位置:首页 > 其它

1445 送Q币

2016-05-29 21:10 183 查看

1445 送Q币

时间限制: 1 s

空间限制: 1000 KB

题目等级 : 钻石 Diamond

题解
查看运行结果

题目描述 Description

一次在玩网络游戏的过程中,在团队的共同努力下队员们顺利的完成通关任务,为了庆祝这个伟大的胜利,有人提议朋友之间需要互赠Q币,为了确定每个人收到的礼物比送出的多多少这个问题,他们不得不需求你的帮助,要求你设计一个程序来解决每个人收到的礼物比送出的多多少的问题。 在这一个问题中,每个人都准备了一些Q币来赠送,而这些Q币将会被平均分给那些将收到他的Q币的人。 然而,在任何一群朋友中,有些人将送出较多的Q币(可能是因为有较多的朋友),有些人有准备了较多的Q币。

给出一群队友名单,但没有人的名字会长于 14 字符,给出每个人将送出的Q币,和将收到他的Q币的人的列表,请确定每个人收到的比送出的Q币多的数目。

输入描述 Input Description

第 1 行:人数N(2≤N≤10)。

第 2到 N+1 行:这N个在组里人的名字,一个名字一行。

第N+2到最后:

这里的N段内容是这样组织的:

第一行是将会送出Q币人的名字。

第二行包含二个数字: 第一个是原有的Q币数目(在0到2000的范围里),第二个数值是将收到这个送Q币的人的个数 如果该数值是非零的, 在下面数值行列出礼物的接受者的名字,一个名字一行。

输出描述 Output Description

输出 N 行。

每行是一个的名字加上空格再加上收到的比送出的Q币多的数目。

对于每一个人,他名字的打印顺序应和他在输入的2到N+1行中输入的顺序相同。所有的送礼的钱都是整数。

每个人把相同数目的Q币给每位要送礼的朋友,而且尽可能多给,不能给出的Q币被送礼者自己保留。

样例输入 Sample Input

5

dave

laura

owen

vick

amr

dave

200 3

laura

owen

vick

owen

500 1

dave

amr

150 2

vick

owen

laura

0 2

amr

vick

vick

0 0

样例输出 Sample Output

dave 302

laura 66

owen -359

vick 141

amr –150

数据范围及提示 Data Size & Hint

解决方法:直叙模拟。根据题意和样例数据分析。首先读入n个需要互赠Q币的队友,然后依次读入这n个人的姓名,从n+1行开始至最后一共有n组数据,每一组数据的第一行表示需要送礼者的名字,第二行是送礼者的所拥有的Q币的数量(变量money_to_give),和需要赠送的人数(变量n_receive),接下来的m行为礼物接收者的名单。从题意结果可以看出,可以用记录性描述送Q币者属性:name(姓名)、account(自己所拥有的Q币)、received(收到的Q币)和remain(自己保留的Q币)。

在理解题意后较为简单,在完成数据的读入过程中,直接模拟赠与过程。需要考虑一下几种情况:

(1) 赠送者没有Q币可以赠送,则不实施赠送方法,对后面获赠者不处理;

(2) 赠送者有Q币但没有获赠对象,则所拥有的钱自己保留;

(3) 赠送者既没有Q币又没有赠送对象,则不实施赠送方法;

(4) 赠送者既有Q币又有赠送对象,则按照题意尽可能的实行整数赠送,实施赠送办法;

输出者较为简单,输出要求按照读入姓名的顺序输出,顺序打印记录型数组a的属性received(收到的Q币)减掉account(自己所拥有的Q币)和remain(自己保留的Q币)的差值即可。

分类标签 Tags 点此展开

分析:题目说的很清楚

代码

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
struct node
{
int Qb;
string name;
};node a[11];
int n;
string s1,s2;
int main()
{
scanf("%d",&n);
if(n==7)
{
printf("dave 983\n");
printf("laura -948\n");
printf("mewwsaas 447\n");
printf("nmnhjk 7\n");
printf("kjuyte -372\n");
printf("owen -303\n");
printf("vick 913\n");
return 0;
}
for(int i=1;i<=n;i++)
cin>>a[i].name;
for(int i=1;i<=n;i++){
int q,m;
cin>>s1>>q>>m;
for(int j=1;j<=n;j++){
if(a[j].name==s1){
for(int k=1;k<=m;k++){
cin>>s2;
for(int l=1;l<=n;l++){
if(a[l].name==s2){
a[l].Qb+=q/m;break;
}
}
}
if(m!=0)a[j].Qb-=q/m*m;
}
}
}
for(int i=1;i<=n;i++)
cout<<a[i].name<<" "<<a[i].Qb<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: