这题是一个模拟p2p的网络的一个题目。题意比较繁琐,只要看懂课,细心一点就很好AC了。直接上代码了,存模拟。
#include<stdio.h> #include<string.h> #include<iostream> #include<string> #include<queue> #include<cmath> #include<map> #include<algorithm> #include<vector> #include<bitset> using namespace std; const int inf = 0x3fffffff; const int mmax = 1010; bool Server[30]; bool Online[30][mmax]; int Speed[30][30]; int Start_time[30]; int Large[30]; int n,T,k,S; void download(int nowtime, int c_id) { int sum=0; for(int i=1;i<=n;i++) { if(Server[i] && Online[i][nowtime]) { sum+=Speed[i][c_id]; } } Large[c_id]+=sum; } int main() { int Case; scanf("%d",&Case); while(Case--) { scanf("%d %d",&n,&T); scanf("%d %d",&k,&S); memset(Server,0,sizeof Server); memset(Online,0,sizeof Online); for(int i=0;i<k;i++) { int x; scanf("%d",&x); Server[x]=1; } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&Speed[i][j]); if(i==j) Speed[i][j]=0; } int t; for(int i=1;i<=n;i++) { scanf("%d",&t); while(t--) { int st,en; scanf("%d %d",&st,&en); en=min(en,T+1); for(int j=st+1;j<=en;j++) Online[i][j]=1; } } for(int i=1;i<=n;i++) Start_time[i]=inf; //cout<<Start_time[1]<<endl; int m; scanf("%d",&m); while(m--) { int download_time,computer_id; scanf("%d %d",&download_time,&computer_id); Start_time[computer_id]=min(Start_time[computer_id],download_time); } memset(Large,0,sizeof Large); for(int i=1;i<=T;i++) { for(int j=1;j<=n;j++) { if(!Server[j]&& Start_time[j]<i && Online[j][i]) download(i,j); } for(int j=1;j<=n;j++) { if(Large[j]>=S) { Server[j]=1; Large[j]=S; } } } // for(int i=1;i<=n;i++) // { // cout<<Large[i]<<" "; // } // cout<<endl; for(int i=1;i<=n;i++) { if(Server[i]) printf("100%%\n"); else printf("%d%%\n",Large[i]*100/S); } } return 0; }
时间: 2025-01-06 19:18:35