HDU - 3269 P2P File Sharing System
/*******************************************************
* @Nstd
* 题号:HDU - 3269
* 类型:模拟
* 题目:模拟P2P下载
* 给出server和client信息(上线时间段和下载开始时间)
* client可以从所有的server那并行地下载
* client下完后下一秒就可以做server
* 上传和下载速率相同,已给出速率矩阵
* 求最后每个人下载的百分比,server肯定为100%
* 思路:因为时间最多要1000秒,而总共才20人
* 所以每一秒每一秒地模拟
* 在computer结构体中用bool数组保存该用户当前秒
* 有没有启动客户端
* 开两个队列分别记录server和client的下标
* 然后循环client队列找server下载
* 问题:初始化有个大问题
* 开的bool数组,用memset()在范围[s,e]精确置1失败
* 查了好一会儿
* 还有一个大问题:用bool数组名进行了if判断,
* 应该是if(able[i])的结果写成了if(able),查了好久
* 特例:无
* 注:从下午3点断断续续(晚上有选修)做到了晚上12点
* 注意力还是不能好好集中
*
* —— 2012/3/21
*******************************************************/
1 #include <stdio.h>
2 #include <iostream>
3 #include <string.h>
4 #include <algorithm>
5 using namespace std;
6
7 #define N 32
8 #define cls(a) memset(a, 0, sizeof(a))
9 #define cls1(a,i,j) memset(a+i, 1, (j-i+1)*sizeof(bool))
10 #define cls0(a, i) memset(a, 0, i*sizeof(bool))
11
12 struct computer{
13 bool able[1005];
14 int pcent;
15 }cpt[N];
16
17 bool isSver[N];
18 int Sver[N];
19 int Clnt[N];
20 int rate[N][N];
21
22 int main()
23 {
24 int d, n, t, k, s, i, j, l, st, ed, m, c;
25 scanf("%d", &d);
26 while(d--)
27 {
28 cls(isSver);
29 cls(Clnt);
30 cls(Sver);
31 cls(cpt);
32 cls(rate);
33
34 scanf("%d%d", &n, &t);
35 scanf("%d%d", &s, &k);
36 for(i=0; i<s; i++)
37 {
38 scanf("%d", Sver+i);
39 isSver[Sver[i]] = 1;
40 cpt[Sver[i]].pcent = k;
41 }
42
43 for(c=0, i=1; i<=n; i++)
44 {
45 if(!isSver[i]) Clnt[c++] = i;
46 }
47
48 for(i=1; i<=n; i++)
49 {
50 for(j=1; j<=n; j++)
51 {
52 scanf("%d", rate[i]+j);
53 }
54 }
55
56 for(i=1; i<=n; i++)
57 {
58 scanf("%d", &m);
59 for(j=0; j<m; j++)
60 {
61 scanf("%d%d", &st, &ed);
62 if(st > t) continue;
63 if(ed > t) ed = t;
64 for(l=st; l<ed; l++) cpt[i].able[l] = 1;
65 }
66 }
67
68 scanf("%d", &m);
69 for(i=0; i<m; i++)
70 {
71 scanf("%d%d", &ed, &st);
72 cls0(cpt[st].able, ed);
73 }
74
75 for(i=0; i<=t; i++)
76 {
77 for(j=0; j<c; j++)
78 {
79 if(cpt[Clnt[j]].able[i])
80 {
81 for(l=0; l<s; l++)
82 {
83 if(cpt[Sver[l]].able[i])
84 {
85 cpt[Clnt[j]].pcent += rate[Clnt[j]][Sver[l]];
86 }
87 }
88 }
89 }
90 for(j=0; j<c; j++)
91 if(cpt[Clnt[j]].pcent >= k)
92 {
93 isSver[Clnt[j]] = 1;
94 Sver[s++] = Clnt[j];
95 for(c--, l=j; l<c; l++)
96 Clnt[l] = Clnt[l+1];
97 }
98 }
99
100 for(i=1; i<=n; i++)
101 {
102 printf("%d%%\n", cpt[i].pcent>=k ? 100 : (cpt[i].pcent*100/k));
103 }
104 }
105
106 return 0;
107 }