题意:
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;
}