题意:有n个人,m个通讯设备,通讯k次。给出人可以通讯的矩阵。当一个人在某台设备通讯时,其他人可以接收,问k次通讯结束后每个人接收了多少次。
思路:开始没看清楚m的范围,如果简单暴力,通讯一次就把接收到的人加一次,这样要n*k的时间,一看就会超时。再一看m的取值范围是【1,10】,所以我可以先不管是谁通讯,只要对某个设备通讯,就统计,最后一次把连接这个设备的人加上统计的值,但是通讯的那个人又不能接收,所以多加了他通讯的次数,只需在统计一下他通讯多少次就可以了。
代码:
#include<stdio.h> #include<string.h> const int maxn = 20009; int map[maxn][14]; int spyke[14]; int per[maxn]; int sum[maxn]; void init() { memset(spyke,0,sizeof(spyke)); memset(per,0,sizeof(per)); memset(sum,0,sizeof(sum)); } int main() { int n,m,k,i,j; while(~scanf("%d%d%d",&n,&m,&k)) { init(); for(i=1;i<=n;i++) { for(j =1;j<=m;j++) { scanf("%d",&map[i][j]); } } for(i=0;i<k;i++) { int a,b; scanf("%d%d",&a,&b); per[a] ++; spyke[b] ++; } for(i=1;i<=m;i++) { for(j = 1;j<=n;j++) { sum[j] +=map[j][i] * spyke[i]; } } for(i=1;i<=n;i++) { sum[i] -=per[i]; } for(i=1;i<=n;i++) { printf("%d ",sum[i]); } printf(" "); } return 0; }