题意:
AC代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct node { int Time[1010]; //记录这个是时间是否工作 int Start; //开机时间 int Server; // 是否为服务器 int Size; //目前的下载量 void clear() { memset(Time, 0, sizeof Time); Start = 1e9; Server = 0; Size = 0; } }; int main() { int Case; int t; scanf("%d", &t); while (t--) { int N, T; node Computer[30]; scanf("%d%d", &N, &T); //电脑的台数 总时间 for (int i = 1; i <= N; i++) { Computer[i].clear(); } int K, SIZE; scanf("%d%d", &K, &SIZE); //服务器的台数 下载文件的大小 for (int i = 1; i <= K; i++) { int x; scanf("%d", &x); Computer[x].Server = 1; Computer[x].Size = SIZE; } int speed[30][30]; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { scanf("%d", &speed[i][j]); // i-j 两台电脑的传输速度 } } for (int i = 1; i <= N; i++) { int k; scanf("%d", &k); //第i台电脑的开关机时间段 while (k--) { int l, r; scanf("%d%d", &l, &r); for (int j = l; j < r; j++) //左闭 右开 样例可知 { if (j >= 0 && j <= T) { Computer[i].Time[j] = 1; //标记当前时间可用 } } } } int num; scanf("%d", &num); //num台电脑下载 for (int i = 1; i <= num; i++) { int x, y; scanf("%d%d", &x, &y); //电脑y在x时间开始下载 Computer[y].Start = x; } for (int i = 1; i < T; i++) { for (int k = 1; k <= N; k++) { if (Computer[k].Server == 1) continue; //服务器不用下载 默认下载完成 for (int l = 1; l <= N; l++) { if (Computer[l].Server == 1 && Computer[k].Start <= i && Computer[k].Time[i] == 1 && Computer[l].Time[i] == 1) Computer[k].Size += speed[k][l]; } } for (int j = 0; j <= N; j++) { if (Computer[j].Size >= SIZE) // 把文件下载完的电脑会转变为服务器 Computer[j].Server = 1; } } for (int i = 1; i <= N; i++) { if (Computer[i].Server == 1) printf("100%%\n"); else { printf("%d%%\n", Computer[i].Size * 100 / SIZE); } } } return 0; }