1.Sorry,打错了(250分)
题目描述
龙先生是一位著名的记者,平时最喜欢报道一些鲜为人知的故事。最近,由于听说索马里海盗猖獗,他打算实地探访,做一个深入的调查。
龙先生联系了索马里当地的一些朋友,做了周密的计划——坐船从三亚出发,越过南海,趟过印度洋,最后到达索马里海域的亚丁湾。可就在船离海岸仅10公里时,突然一伙海盗突袭客船,所有人都被劫持到了索马里城内。
在人质被运送到“海盗基地”的途中,龙先生凭着多年的经验,乘海盗不注意,跃下了卡车,在无数砰砰的枪声中,没命的向外跑去。跑了几分钟后,龙先生突然看到一个电话厅。他迅速向电话厅奔去,想打电话向住在索马里的朋友求助。然而,随着追赶脚步声的临近,龙先生估算留给自己打电话的时间最多30秒,决不容许拨错电话。
遗憾的是,越是这种危机的时候,越容易犯错。身为“智者”的您,请帮龙先生算一算:当他打电话给一位朋友的时候,恰好打给了另外一个人(不一定是他朋友)的概率是多少?已知索马里是一个有不超过10万人的小城,电话号码只有6位。
输入格式
第1行:索马里人数n。n <= 100000
接下来的n行:所有人的电话号码
接下来的10行:一个10*10错按表,表示按a键时按成b键的概率(第一行第一列表示按0时按成0的概率,第一行第二列表示按0时按成1的概率。所有的概率用整数0~10表示,即实际概率要除以10)
下一行:索马里城中你的朋友人数m。m <= n。
接下来的m行:每个朋友的电话号码。
输出格式
打给你的每一个朋友时候,打通其他人的电话的概率(每行一个概率,乘以10^6 后用整数表示)
输入样例
5
267535
229127
693606
861879
902375
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
5
267535
229127
693606
861879
902375
输出样例
4
4
4
4
4
测试数据
共10个测试点,基本参数如下表:
测试点编号 | n | m |
1 | 10 | 5 |
2 | 50 | 25 |
3 | 300 | 100 |
4 | 2000 | 1000 |
5 | 8000 | 3000 |
6 | 30000 | 10000 |
7 | 50000 | 10000 |
8 | 100000 | 20000 |
9 | 100000 | 50000 |
10 | 100000 | 100000 |
#include <stdio.h>
#define MAX 100000
int main()
{
int n,m,sum=0;
int i=0,j;
int g[10][10];
char d_r[MAX][6];
char d_f[MAX][6];
scanf("%d",&n);
while(i<n){
scanf("%s",d_r[i]);
i++;
}
for(i=0;i<10;i++)
for(j=0;j<10;j++)
scanf("%d",&g[i][j]);
i=0;
scanf("%d",&m);
while(i<m){
scanf("%s",d_f[i]);
i++;
}
i=0;
while(i<m){
for(j=0;j<n;j++){
sum+=g[d_f[i][0]-48][d_r[j][0]-48]*g[d_f[i][1]-48][d_r[j][1]-48]/
*g[d_f[i][2]-48][d_r[j][2]-48]*g[d_f[i][3]-48][d_r[j][3]-48]/
*g[d_f[i][4]-48][d_r[j][4]-48]*g[d_f[i][5]-48][d_r[j][5]-48];
}
sum-=g[d_f[i][0]-48][d_f[i][0]-48]*g[d_f[i][1]-48][d_f[i][1]-48]/
*g[d_f[i][2]-48][d_f[i][2]-48]*g[d_f[i][3]-48][d_f[i][3]-48]/
*g[d_f[i][4]-48][d_f[i][4]-48]*g[d_f[i][5]-48][d_f[i][5]-48];
printf("%d/n",sum);
sum=0;
i++;
}
return 0;
}