Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 708 Accepted Submission(s): 261
Description
圣诞节快到了,同学们每个人都准备了一定的钱用来买礼物。已知每个人送礼物的时候都会把自己准备的钱平均分成自己要送的人数份,送给自己的好友,剩余的钱留在自己手中。同时,也会收到若干份礼物。//我也很奇怪,为什么会有剩余,难道是无法整除?(没错!
现在,LG统计了一下每个人送礼的情况,想请你计算一下大家赔了还是赚了。
Input
第1行一个整数N(0<N<=100),表示人数;
第2行至第N + 1每行一个长度小于50的字符串,表示每个人的名字;
其后N段,每段第一行为人名;
每段第二行为两个整数Si(0<=Si<=10000),Ki(0<=Ki<M),表示这个人准备的用于送礼的钱数和他要送的好友数;
每段其余Ki行每行一个人名,表示要送给的好友。
Output
共N行,按照输入第2至第N + 1行给定的顺序输出人名及每个人赚了多少(若赔了则输出负数)
Sample Input
3 LG SYC WZ LG 55 2 SYC WZ SYC 100 0 WZ 77 2 LG SYC
Sample Output
LG -16 SYC 65 WZ -49
Source
注意:
(一)
if(x[i].name == s)对标的是:
char name[58];
string s;
或
string name[58];
string s;
不可以
char name[58];
char s[58];
解决:用
if(strcmp(s,x[i].name)==0)
(二)
无法整除的解决核心:
x[k].sum-=(mon/num)*num;
x[j].sum += (mon / num);
附上AC代码:
#include <cstdio>
#include <iostream>
using namespace std;
struct node
{
char name[58];
int sum;
}x[100000 + 8];
int n,i,k,j,t,mon,num;
string s;
int main()
{
cin>>n;
for(i=0; i<n; i++)
{
scanf("%s",&x[i].name);
x[i].sum=0;
}
for(i=0; i<n; i++)
{
cin>>s;
scanf("%d%d",&mon,&num);
for(int k=0; k<n; k++)
{
if(x[k].name == s)
{
if(num==0)
x[k].sum-=0;
else if(num>0)
x[k].sum-=(mon/num)*num;
break;//
}
}
for(int k= 0; k < num; k++)
{
cin>>s;
for(int j= 0; j < n; j++)
{
if(x[j].name == s)
{
if(num==0)
x[j].sum+=0;
else
x[j].sum += (mon / num);
break;
}
}
}
}
for(i = 0; i < n; i++)
{
cout<<x[i].name<<" "<<x[i].sum<<'\n';
}
return 0;
}