描述
转会是体育领域的专业名词,是指运动员在本身合同期限内,从某一家俱乐部或球队,通过俱乐部及个人双重合同达成协议,转至另外一家俱乐部或球队的过程。比如09年夏天,曼联与皇家马德里就C罗达成的9100万欧元转会费的世纪转会。
每年的转会市场都错综复杂,于是我们需要高效的程序来处理转会信息。
为了简化问题,我们对其进行如下假设:
在转会时间开始前,每个球队都会有若干名队员,并会有相应的转会预算。
转会时间开始后,程序会收到如下转会信息。
1.甲球队向乙球队申请某一位的乙队球员转会至甲队,并许诺支付一定的转会金额。
2.甲球队向乙球队出售一位甲队球员转会至乙队,并期望获得一定的转会金额。
当然,不是每一次转会才能获得成功。当出现以下情况的一种,转会将不会发生。
对于情况1,以下任意一种情况可导致转会失败:
甲队的转会预算已经低于许诺支付的转会金额。
甲队许诺的转会金额低于该球员的身价评估。
若转会成功,甲队的队员总数将大于11人。
不存在乙队。
不存在甲队。
乙队不存在该球员。
甲队和乙队是同一只球队。
对于情况2,以下任意一种情况可导致转会失败:
乙队的转会预算已经低于甲队希望获得的转会金额。
甲队期望的转会金额大于或者等于该球员的身价评估。
若转会成功,乙队的队员总数将大于11人。
4.不存在甲队。
5.不存在乙队。
6.甲队不存在该球员。
7.甲队和乙队是同一只球队。
若转会成功,则球员转入方获得该名球员,球员转出方的转会预算增加所获得的转会金额,球员转入方支付相应的转会金额(从转会预算里减去)。
基于一些转会的事实,以下事件应该被考虑:
当甲球队向乙球队求购乙队的A队员时。若转会失败,则乙队的A队员的身价将提高100.
当甲球队向乙球队推荐甲球队的A队员时。若转会失败,则甲队的A队员的身价将减少100(如果身价本身小于100,则不减少).
无论何时,若转会发生,则转会球员的身价评估变为本次转会的转会金额。
为了防止球员转会频率过高,而引起的转会纠纷。在球员发生转会后的,5条信息内(包括5条),所有针对该球员转会申请均会视为无效,即该次转会既不会获得成功转会,也不会对球员身价产生影响。
现在请你设计一个程序,判断每一条转会信息是否能获得转会成功。输入
第一行有一个整数T(T <= 10),代表测试数据组数。
每组测试数据以一个整数n(n <= 10)开始,代表当前球队数目。
接下去给出每支球队的信息,如下。
第一行有一个字符串teamName(长度不超过11个字符)和两个整数numOfPlayers,money.
代表这只球队的名字,和球员数目和转会预算.
接下去numOfPlayers行,每行有一个字符串和一个整数.代表每个球员的姓名和他的身价评估.
当所有的球队信息都给完后.将给出所有的转会信息.
首先是一个整数Q(Q <= 100),代表消息总数.
接下去Q行每行给出该条转会信息的具体内容.
消息的格式如下.
Type team1 team2 player money.
若type 为1 ,则代表team1向team2以money的价格申请player转会。
若type 为2,则代表team1 试图将player 转会至team2,并期望获得money(money <= 10000)的转会金额.
所有的字符串均唯一,且仅包含字母.
输出
对于每一组数据输转会结果,若转会成功.则输出:
Player go to TeamNow from TeamBefore for money.
其中player代表转会球员名,TeamNow代表转会去向球队,TeamBefore代表原球队,money为本次转会金额.
若转会不成功.则输出:No.
注意每句话后有英文句号!样例输入
样例输出
#include
#include
#include
using namespace std;
int t,n,i,j,m,type,money;
char team1[20],team2[20],player[20];
int qdui1,qyuan1,ysuan1;
int qdui2,qyuan2,ysuan2;
typedef struct qiuyuan
{
char name[20];
int m;
int sum;
}qy[1000];
struct qiudui
{
char teamName[20];
int numOfPlayers,money;
qy Q;
};
struct qiudui qd[2000];
int cz1(char a[])
{
for(i=1;i<=n;i++)
{
if(strcmp(qd[i].teamName,a)==0)return i;
}
return -1;
}
int cz2(char a[],int i)
{
for(j=1;j<=qd[i].numOfPlayers;j++)
{
if(strcmp(qd[i].Q[j].name,a)==0)
return j;
}
return -1;
}
int cz3()
{
for(int i=1;i<=n;i++)
for(j=1;j<=qd[i].numOfPlayers;j++)
{
if(qd[i].Q[j].sum>0)qd[i].Q[j].sum--;
}
return 0;
}
int ken(int qdui,int qyuan)
{
//qd[qdui].Q[qyuan].m=money;
qd[qdui].Q[qyuan].m+=100;
}
int ken1(int qdui,int qyuan)
{
//qd[qdui].Q[qyuan].m=money;
if(qd[qdui].Q[qyuan].m>=100)
qd[qdui].Q[qyuan].m-=100;
}
int fun1()
{
qdui1=cz1(team1);
qdui2=cz1(team2);
qyuan2=cz2(player,qdui2);
if(qdui1==qdui2){return 0;}
cz3();
if(qdui1==-1||qdui2==-1)return 0;
if(qyuan2==-1)return 0;
if((qd[qdui2].Q[qyuan2].sum--)>1)return 0;
if(qd[qdui1].money=11){ken(qdui2,qyuan2);return 0;}
//以下是转入成功的时候
qd[qdui2].Q[qyuan2].sum=5;
return 1;
}
int fun2()
{
qdui1=cz1(team1);
qdui2=cz1(team2);
qyuan1=cz2(player,qdui1);
cz3();
if(qdui1==-1||qdui2==-1)return 0;
if(qyuan1==-1)return 0;
if((qd[qdui1].Q[qyuan1].sum--)>1)return 0;
if(qdui1==qdui2){return 0;}
if(qd[qdui2].money=qd[qdui1].Q[qyuan1].m){ken1(qdui1,qyuan1);return 0;}
if(qd[qdui2].numOfPlayers>=11){ken1(qdui1,qyuan1);return 0;}
//以下是转入成功的时候
qd[qdui1].Q[qyuan1].sum=5;
return 1;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
memset(qd,0,sizeof(qd));
// memset(qiuyuan,0,sizeof(qiuyuan));
for(i=1;i<=n;i++)
{
cin>>qd[i].teamName>>qd[i].numOfPlayers>>qd[i].money;
for(j=1;j<=qd[i].numOfPlayers;j++)
{
cin>>qd[i].Q[j].name>>qd[i].Q[j].m;
qd[i].Q[j].sum=0;
}
}
cin>>m;
for(int ii=1;ii<=m;ii++)
{
cin>>type>>team1>>team2>>player>>money;
if(type==1)
{
if(fun1())
{
printf("%s go to %s from %s for %d.\n",qd[qdui2].Q[qyuan2].name,qd[qdui1].teamName,qd[qdui2].teamName,money);
{
strcpy(qd[qdui1].Q[++qd[qdui1].numOfPlayers].name,qd[qdui2].Q[qyuan2].name);
qd[qdui1].Q[qd[qdui1].numOfPlayers].m=money;
qd[qdui1].Q[qd[qdui1].numOfPlayers].sum=qd[qdui2].Q[qyuan2].sum;
}
for(i=qyuan2;i<=qd[qdui2].numOfPlayers-1;i++)
strcpy(qd[qdui2].Q[i].name,qd[qdui2].Q[i+1].name);
qd[qdui2].numOfPlayers--;
qd[qdui1].money-=money;
qd[qdui2].money+=money;
}
else cout<<"No."<