hdu 3269 P2P File Sharing System(大模拟)

来源:互联网 发布:剑三正太捏脸数据 南风 编辑:程序博客网 时间:2024/05/21 17:13

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3269

思路:

读题型题目,今天模拟比赛时候我不想读这么长的题目,队友又不想写模拟,最后只能我硬着头皮上,不过当时实在是有点累了在结束前没敲出来,休息了一会上去一调就过了。

做的时候就是注意时间的片段是左闭右开的,然后一秒一秒模拟的好。

代码可能写得有点乱了~

code:

#include <cstdio>#include <cstdlib>#include <iostream>#include <cstring>using namespace std;const int maxn=100;const int maxe=10000;struct node1{int time,num;} down[maxe];struct node2{int ss,tt;}P[maxn][maxe];int cap[maxn];//记录每个电脑的容量int ser[maxn];   //记录服务器的编号int duan[maxn];   //表示每个电脑的开始时间段的个数int vv[maxn][maxn];int T,n,k,S,ff;//ff表示服务器的个数bool mark[maxn];  //表示那个服务器可以用bool kno[maxn];   //表示每个电脑是不是服务器void jud(int time){    memset(mark,0,sizeof(mark));for(int i=0;i<ff;i++){int v=ser[i];for(int j=0;j<duan[v];j++){if(P[v][j].ss<=time&&P[v][j].tt>time){mark[v]=1;break;}}}}void debug(){    for(int i=0;i<n;i++) printf("cap[i]=%d\n",cap[i]);}int main(){int kk,nn,v;bool flag;scanf("%d",&kk);while(kk--){scanf("%d%d",&n,&T);scanf("%d%d",&ff,&S);memset(cap,0,sizeof(cap));memset(kno,0,sizeof(kno));for(int i=0;i<ff;i++){scanf("%d",&ser[i]);ser[i]--;cap[ser[i]]=S;kno[ser[i]]=1;}for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&vv[i][j]);for(int i=0;i<n;i++){scanf("%d",&duan[i]);for(int j=0;j<duan[i];j++) scanf("%d%d",&P[i][j].ss,&P[i][j].tt);}scanf("%d",&nn);for(int i=0;i<nn;i++){scanf("%d%d",&down[i].time,&down[i].num);down[i].num--;}for(int i=0;i<=T;i++){jud(i);for(int j=0;j<nn;j++){if(down[j].time<=i){v=down[j].num;if(kno[v]) continue;flag=0;for(int k=0;k<duan[v];k++){if(P[v][k].ss<=i&&P[v][k].tt>i){flag=1;break;}}if(flag){for(int i=0;i<ff;i++){if(!mark[ser[i]]) continue;cap[v]+=vv[v][ser[i]];}}}}for(int j=0;j<n;j++){if(cap[j]>=S&&!kno[j]){                    ser[ff++]=j;                    kno[j]=1;}}}//debug();for(int i=0;i<n;i++) if(cap[i]>=S) cap[i]=S;for(int i=0;i<n;i++){            printf("%d%%\n",(int)(((double)cap[i]/S)*100));}}return 0;}


0 0