POJ 3836 HDU 3269 P2P File Sharing System

题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=3269

题目大意:模拟一个P2P 下载,每对机器都有一个传输速率,每一个机器都有在线和离线时间,和下载的开始时间,当一个机器开始下载时,它将从所有在线且提供下载且与他有速度的服务器上下载。当它下载完成时,下一秒它就变成了服务器。问T时间之后,各个机器的完成百分比是多少。

分析:模拟就行了,就是麻烦点,题目大意就是模拟方法...还有就是注意一些细节问题了。输出百分号是要写两个它才能A啊...而且不要忘了乘10。

 

代码:

View Code
#include<stdio.h>
#include<string.h>
int T,n,k,m,Data;
int sever[25];
int a[25][25];
int in[25][1010];
int d[25];
int start[25];
void init()
{
int y,x,t,temp;
memset(sever,0,sizeof(sever));
memset(in,0,sizeof(in));
memset(d,0,sizeof(d));
memset(start,-1,sizeof(start));
scanf("%d%d",&n,&T);
scanf("%d%d",&k,&Data);
for(int i=0;i<k;i++)
{
scanf("%d",&temp);
sever[temp]=1;
d[temp]=Data;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
for(int j=1;j<=t;j++)
{
scanf("%d%d",&x,&y);
for(int k=x;k<y;k++)
in[i][k]=1;
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&y,&x);
if(start[x]==-1||start[x]>y)
start[x]=y;
}
}

void work()
{
for(int i=0;i<T;i++)
{
for(int j=1;j<=n;j++)
{
if(!sever[j]&&in[j][i]&&start[j]!=-1&&start[j]<=i)
{
for(k=1;k<=n;k++)
if(sever[k]&&in[k][i]) d[j]+=a[j][k];
}
}
for(int j=1;j<=n;j++)
if(!sever[j]&&d[j]>=Data)
{
d[j]=Data;
sever[j]=1;
}
}
}
int main()
{
int Case;
freopen("in","r",stdin);
scanf("%d",&Case);
while(Case--)
{
init();
work();
for(int i=1;i<=n;i++)
printf("%d%%\n",d[i]*100/Data);
}
return 0;
}



posted @ 2012-03-15 11:39  Evan1004  阅读(244)  评论(0编辑  收藏  举报