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;
}