题目大意:
题目很长.....不过实现并不难....当年华科校赛遇到这个题没做...现在补一下
就是现在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; }