zoukankan      html  css  js  c++  java
  • 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
     *******************************************************/

    hdu - 3269
      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 }



  • 相关阅读:
    每天一个小算法(Heapsort)
    每天一个小算法(matlab armijo)
    每天一个小算法(Shell sort5)
    每天一个小算法(Shell Sort3)
    每天一个小算法(Shell Sort2)
    Java并发编程:阻塞队列
    Java并发编程:并发容器之CopyOnWriteArrayList
    Java并发编程:并发容器之ConcurrentHashMap
    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
    豆瓣的前世今生
  • 原文地址:https://www.cnblogs.com/Nstd/p/2410848.html
Copyright © 2011-2022 走看看