Codeforces Gym 100340C ePig 模拟

题目大意:

题目很长.....不过实现并不难....当年华科校赛遇到这个题没做...现在补一下

就是现在P2P协议进行文件传输

现在又n个客户端, 一个包被分成k个部分进行发送, 发送到所有客户端需要的时间

发送规则:

首先初始状态只有Client 1拥有完整文件(所有的包)进行提供

每一轮 开始时所有Client机器决定需要的包, 每个Client需要的包是其没有的所有包中供源最少的包, 如果有多个选择序号最小的包

然后每个Client决定要从哪里获得包, 获得包的原则是在所有能提供这个包的Client中选择, 并且选择从拥有包的数量最少的Client那里获得, 如果依旧有多个选择就选择序号最小的Client

然后每个Client都会有得到的请求, 这个时候所有Client决定要给谁包, 每个Client只能满足一个请求, 每个Client会选择曾经给它包的数量最多的Client, 如果有多个, 那么选择拥有包数量最少的Client, 如果依旧有多个, 选择序号最小的

于是每轮都这样重复, 到某一轮之后所有Client有所有包, 传输结束

输出除了Client 1之外, 其他Client得到完整的全部包的轮数


大致思路:

上面的过程看懂了很容易过的....

模拟题还是要耐心...


代码如下:

Result  :  Accepted     Memory  :  460 KB     Time  :  560 ms

/*
 * Author: Gatevin
 * Created Time:  2015/9/1 16:41:44
 * File Name: C.cpp
 */
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<ctime>
#include<iomanip>
using namespace std;
const double eps(1e-8);
typedef long long lint;

int n, k;
struct Client
{
    int own[210];
    int pro[210];
    int has;
    int giv;
    int complete;
    int need;
    int req;
    int gei;
    Client()
    {
        memset(own, 0, sizeof(own));
        memset(pro, 0, sizeof(pro));
        has = giv = 0;
        complete = -1;
        need = req = -1;
        gei = -1;
    }
};

Client client[110];
int all = 0;
int provide[210];
vector<int> V[110];
int g[110][110];

void start()
{
    memset(g, 0, sizeof(g));
    int time = 1;
    client[1].complete = 1;
    fill(client[1].own, client[1].own + k + 1, 1);
    fill(client[1].pro, client[1].pro + k + 1, 1);
    client[1].has = client[1].giv = k;
    client[1].gei = -1;
    all = 1;
    for(int i = 1; i <= k; i++)
        provide[i] = 1;
    
    while(all < n)
    {
        for(int i = 1; i <= n; i++)
            client[i].need = client[i].req = -1;
        for(int i = 1; i <= n; i++)//decide which chunk need
        {
            if(client[i].has == k)
            {
                client[i].need = -1;
                continue;
            }
            int get = -1;
            for(int j = 1; j <= k; j++)
            {
                if(client[i].own[j] == 1) continue;
                if(get == -1 || provide[j] < provide[get]) get = j;
            }
            client[i].need = get;
        }
        for(int i = 1; i <= n; i++)//decide which client to request
        {
            int need = client[i].need;
            if(need == -1)
            {
                client[i].req = -1;
                continue;
            }
            int req = -1;
            int number = -1;
            for(int j = 1; j <= n; j++)
            {
                if(client[j].own[need])
                {
                    if(req == -1)
                    {
                        req = j;
                        number = client[j].giv;
                        continue;
                    }
                    if(number > client[j].giv)
                    {
                        req = j;
                        number = client[j].giv;
                    }
                }
            }
            client[i].req = req;
        }
        
        for(int i = 1; i <= n; i++) V[i].clear();
        for(int i = 1; i <= n; i++)
            if(client[i].req != -1)
            {
                V[client[i].req].push_back(i);
            }
        
        for(int i = 1; i <= n; i++)
        {
            int now = -1;
            for(int j = 0, sz = V[i].size(); j < sz; j++)
            {
                int nex = V[i][j];
                if(now == -1)
                {
                    now = V[i][j];
                    continue;
                }
                if(g[i][nex] > g[i][now])
                    now = nex;
                else if(g[i][nex] == g[i][now])
                {
                    if(client[nex].has < client[now].has)
                        now = nex;
                }
            }
            client[i].gei = now;
        }
        
        for(int i = 1; i <= n; i++)
        {
            if(client[i].gei != -1)
            {
                int nex = client[i].gei;
                int thing = client[nex].need;
                client[nex].own[thing] = 1;
                client[nex].has++;
                if(client[nex].has == k) client[nex].complete = time, all++;
                client[nex].pro[thing] = 1;
                provide[thing]++;
                client[nex].giv++;
                g[nex][i]++;
            }
        }
        time++;
    }
    for(int i = 2; i <= n; i++)
        printf("%d%c", client[i].complete, i == n ? '\n' : ' ');
}

int main()
{
    freopen("epig.in", "r", stdin);
    freopen("epig.out", "w", stdout);
    scanf("%d %d", &n, &k);
    start();
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您提供的链接是Codeforces的一个问题,问题编号为104377。Codeforces是一个知名的在线编程竞赛平台,经常举办各种编程比赛和训练。GymCodeforces的一个扩展包,用于组织私人比赛和训练。您提供的链接指向了一个问题的页面,但具体的问题内容和描述无法通过链接获取。如果您有具体的问题或需要了解关于Codeforces Gym的更多信息,请提供更详细的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [http://codeforces.com/gym/100623/attachments E题](https://blog.csdn.net/weixin_30820077/article/details/99723867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [http://codeforces.com/gym/100623/attachments H题](https://blog.csdn.net/weixin_38166726/article/details/99723856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [CodeforcesPP:Codeforces扩展包](https://download.csdn.net/download/weixin_42101164/18409501)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值