Codeforces Gym 100340C ePig 模拟
来源:互联网 发布:小米手环抢购软件 编辑:程序博客网 时间:2024/05/22 16:47
题目大意:
题目很长.....不过实现并不难....当年华科校赛遇到这个题没做...现在补一下
就是现在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
- Codeforces Gym 100340C ePig 模拟
- CodeForces Gym 100114C
- CodeForces Gym 100735C
- codeforces Gym-101246C
- Codeforces gym 101243 C
- CodeForces Gym 100646C LCR
- Codeforces gym 101353 C 数论
- Codeforces Gym 100202C Holidays
- Codeforces Gym 100345A BibTeX 模拟
- 【模拟】NEERC15 J Jump (Codeforces GYM 100851)
- 【模拟】NEERC15 G Generators (Codeforces GYM 100851)
- Gym 101341G I love Codeforces 模拟
- Codeforces Gym 100623C Problem C. Class
- Codeforces Gym 100340A Cookies
- Codeforces GYM 100340A Cookies
- Codeforces GYM 100738C Rating Shuffle
- Codeforces Gym 100792C Colder-Hotter
- Codeforces Gym 101142 C. CodeCoder vs TopForces
- parseInt() 和强制转换的区别(int)
- xml的增,删,改,查
- hdu 1551 Cable master(二分法)
- KVC的步骤 以及重点
- UC/OS II 任务管理(2)之就绪表和就绪组
- Codeforces Gym 100340C ePig 模拟
- 登陆界面的数据处理(一)
- Leetcode229 Majority Element II
- expect
- c#使用itextsharp输出pdf(动态填充表单内容,显示中文)
- mysql 事务 与 数据库引擎
- 域传送漏洞总结
- Java中获取键盘输入值的三种方法
- 第0课第1节 刚接触开发板之接口接线工具