2018天梯賽第一次選拔賽


7-1 求組合數(15 分)

本題要求編寫程序,根據公式C(m,n)=n!/(m!(n-m)!)算出從n個不同元素中取出m個元素(mn)的組合數。

建議定義和調用函數fact(n)計算n!,其中n的類型是int,函數類型是double

輸入格式:

輸入在一行中給出兩個正整數m和n(mn),以空格分隔。

輸出格式:

按照格式“result = 組合數計算結果”輸出。題目保證結果在double類型范圍內。

輸入樣例:

2 7

輸出樣例:

result = 21
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long fact(int n)
 4 {
 5     long long sum=1;
 6     for(int i=2;i<=n;i++)
 7         sum*=i;
 8     return sum;
 9 }
10 int main()
11 {
12     int n,m;
13     scanf("%d%d",&m,&n);
14     printf("result = %lld",fact(n)/(fact(m)*fact(n-m)));
15     return 0;
16 }

7-3 判斷上三角矩陣(15 分)

上三角矩陣指主對角線以下的元素都為0的矩陣;主對角線為從矩陣的左上角至右下角的連線。

本題要求編寫程序,判斷一個給定的方陣是否上三角矩陣。

輸入格式:

輸入第一行給出一個正整數T,為待測矩陣的個數。接下來給出T個矩陣的信息:每個矩陣信息的第一行給出一個不超過10的正整數n。隨后n行,每行給出n個整數,其間以空格分隔。

輸出格式:

每個矩陣的判斷結果占一行。如果輸入的矩陣是上三角矩陣,輸出“YES”,否則輸出“NO”。

輸入樣例:

2
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2

輸出樣例:

YES
NO
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int t,a;
 6     cin>>t;
 7     while(t--)
 8     {
 9         int n,flag=1;
10         cin>>n;
11         for(int i=0;i<n;i++)
12             for(int j=0;j<n;j++)
13             {
14                 cin>>a;
15                 if(j<i&&a!=0)
16                     flag=0;
17             }
18         printf("%s\n",flag==1?"YES":"NO");
19     }
20     return 0;
21 }

7-4 整數152的各位數字(10 分)

本題要求編寫程序,輸出整數152的個位數字、十位數字和百位數字的值。

輸入格式:

本題無輸入。

輸出格式:

按照以下格式輸出:

152 = 個位數字 + 十位數字*10 + 百位數字*100
1 #include<bits/stdc++.h>
2 using namespace std;
3 int main()
4 {
5     printf("152 = 2 + 5*10 + 1*100");
6     return 0;
7 }

7-5 韓信點兵(10 分)

在中國數學史上,廣泛流傳着一個“韓信點兵”的故事:韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點兵的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數:

  • 按從1至5報數,記下最末一個士兵報的數為1;
  • 再按從1至6報數,記下最末一個士兵報的數為5;
  • 再按從1至7報數,記下最末一個士兵報的數為4;
  • 最后按從1至11報數,最末一個士兵報的數為10;

請編寫程序計算韓信至少有多少兵。

輸入格式:

本題無輸入

輸出格式:

輸出韓信至少擁有的士兵人數。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    for(int i=1;;i++)
    {
        if(i%5==1&&i%6==5&&i%7==4&&i%11==10)
        {
            printf("%d",i);
            break;
        }
    }
    return 0;
}

7-6 表格輸出(5 分)

本題要求編寫程序,按照規定格式輸出表格。

輸入格式:

本題目沒有輸入。

輸出格式:

------------------------------------
Province      Area(km2)   Pop.(10K)
------------------------------------
Anhui         139600.00   6461.00
Beijing        16410.54   1180.70
Chongqing      82400.00   3144.23
Shanghai        6340.50   1360.26
Zhejiang      101800.00   4894.00
------------------------------------
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     cout<<"------------------------------------\n"
 6         <<"Province      Area(km2)   Pop.(10K)\n"
 7         <<"------------------------------------\n"
 8         <<"Anhui         139600.00   6461.00\n"
 9         <<"Beijing        16410.54   1180.70\n"
10         <<"Chongqing      82400.00   3144.23\n"
11         <<"Shanghai        6340.50   1360.26\n"
12         <<"Zhejiang      101800.00   4894.00\n"
13         <<"------------------------------------\n";
14     return 0;
15 }

7-7 混合類型數據格式化輸入(5 分)

本題要求編寫程序,順序讀入浮點數1、整數、字符、浮點數2,再按照字符、整數、浮點數1、浮點數2的順序輸出。

輸入格式:

輸入在一行中順序給出浮點數1、整數、字符、浮點數2,其間以1個空格分隔。

輸出格式:

在一行中按照字符、整數、浮點數1、浮點數2的順序輸出,其中浮點數保留小數點后2位。

輸入樣例:

2.12 88 c 4.7

輸出樣例:

c 88 2.12 4.70
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     double a,b;
 6     int c;
 7     char ch;
 8     scanf("%lf %d %c %lf",&a,&c,&ch,&b);
 9     printf("%c %d %.2f %.2f",ch,c,a,b);
10     return 0;
11 }

7-2 水仙花數(20 分)

水仙花數是指一個N位正整數(N3),它的每個位上的數字的N次冪之和等於它本身。例如:153=13​​+53​​+33​​。 本題要求編寫程序,計算所有N位水仙花數。

輸入格式:

輸入在一行中給出一個正整數N(3N7)。

輸出格式:

按遞增順序輸出所有N位水仙花數,每個數字占一行。

輸入樣例:

3

輸出樣例:

153
370
371
407
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int Pow(int a,int n)
 4 {
 5     int sum=a;
 6     for(int i=1;i<n;i++)
 7         sum*=a;
 8     return sum;
 9 }
10 int main()
11 {
12     int n;
13     cin>>n;
14     int a=Pow(10,n-1),b=Pow(10,n);
15     for(int i=a;i<b;i++)
16     {
17         int sum=0,div=1;
18         for(int j=0;j<n;j++)
19             sum+=Pow(i/div%10,n),div*=10;
20         if(sum==i)
21             printf("%d\n",i);
22     }
23     return 0;
24 }

7-10 整除光棍(20 分)

這里所謂的“光棍”,並不是指單身汪啦~ 說的是全部由1組成的數字,比如1、11、111、1111等。傳說任何一個光棍都能被一個不以5結尾的奇數整除。比如,111111就可以被13整除。 現在,你的程序要讀入一個整數x,這個整數一定是奇數並且不以5結尾。然后,經過計算,輸出兩個數字:第一個數字s,表示x乘以s是一個光棍,第二個數字n是這個光棍的位數。這樣的解當然不是唯一的,題目要求你輸出最小的解。

提示:一個顯然的辦法是逐漸增加光棍的位數,直到可以整除x為止。但難點在於,s可能是個非常大的數 —— 比如,程序輸入31,那么就輸出3584229390681和15,因為31乘以3584229390681的結果是111111111111111,一共15個1。

輸入格式:

輸入在一行中給出一個不以5結尾的正奇數x<1000)。

輸出格式:

在一行中輸出相應的最小的sn,其間以1個空格分隔。

輸入樣例:

31

輸出樣例:

3584229390681 15

模擬下大數除以小數,now/x為商

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int x,p=0,now=0,Len=0;
 6     scanf("%d",&x);
 7     while(++Len)
 8     {
 9         now=now*10+1;
10         if(p||now/x)
11             cout<<now/x,p=1;
12         now%=x;
13         if(now==0)
14         {
15             cout<<' '<<Len;
16             break;
17         }
18     }
19     return 0;
20 }

7-8 銀行業務隊列簡單模擬(25 分)

設某銀行有A、B兩個業務窗口,且處理業務的速度不一樣,其中A窗口處理速度是B窗口的2倍 —— 即當A窗口每處理完2個顧客時,B窗口處理完1個顧客。給定到達銀行的顧客序列,請按業務完成的順序輸出顧客序列。假定不考慮顧客先后到達的時間間隔,並且當不同窗口同時處理完2個顧客時,A窗口顧客優先輸出。

輸入格式:

輸入為一行正整數,其中第1個數字N(≤1000)為顧客總數,后面跟着N位顧客的編號。編號為奇數的顧客需要到A窗口辦理業務,為偶數的顧客則去B窗口。數字間以空格分隔。

輸出格式:

按業務處理完成的順序輸出顧客的編號。數字間以空格分隔,但最后一個編號后不能有多余的空格。

輸入樣例:

8 2 1 3 9 4 11 13 15

輸出樣例:

1 3 2 9 11 4 13 15
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 vector<int> A,B,C;
 4 int main()
 5 {
 6     int n,t,a;
 7     cin>>n;
 8     for(int i=0;i<n;i++)
 9     {
10         cin>>a;
11         if(a%2)A.push_back(a);
12         else B.push_back(a);
13     }
14     int la=A.size(),lb=B.size();
15     int aa=0,bb=0;
16     for(int i=0;i<la+lb;i++)
17     {
18         if(aa<la)C.push_back(A[aa++]);
19         if(aa<la)C.push_back(A[aa++]);
20         if(bb<lb)C.push_back(B[bb++]);
21     }
22     for(int i=0;i<C.size();i++)
23         if(i==0)cout<<C[i];
24         else cout<<' '<<C[i];
25     return 0;
26 }

7-9 修理牧場(25 分)

農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要N塊木頭,每塊木頭長度為整數Li​​個長度單位,於是他購買了一條很長的、能鋸成N塊的木頭,即該木頭的長度是Li​​的總和。

但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成長度為8、7和5的三段,第一次鋸木頭花費20,將木頭鋸成12和8;第二次鋸木頭花費12,將長度為12的木頭鋸成7和5,總花費為32。如果第一次將木頭鋸成15和5,則第二次鋸木頭花費15,總花費為35(大於32)。

請編寫程序幫助農夫計算將木頭鋸成N塊的最少花費。

輸入格式:

輸入首先給出正整數 N(N≤104),表示要將木頭鋸成N塊。第二行給出N個正整數(N≤50),表示每段木塊的長度。

輸入樣例:

8
4 5 1 2 1 3 1 1

輸出樣例:

49

每次取出優先隊列前兩個最小的組成1個

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     priority_queue<int,vector<int>,greater<int> > Q;
 6     int n;
 7     long long int a,b;
 8     cin>>n;
 9     for(int i=0;i<n;i++)
10     {
11         cin>>a;
12         Q.push(a);
13     }
14     int sum=0;
15     while(Q.size()>1)
16     {
17         a=Q.top();Q.pop();
18         b=Q.top();Q.pop();
19         sum+=a+b;
20         Q.push(a+b);
21     }
22     printf("%d\n",sum);
23     return 0;
24 }

7-13 QQ帳戶的申請與登陸(25 分)

實現QQ新帳戶申請和老帳戶登陸的簡化版功能。最大挑戰是:據說現在的QQ號碼已經有10位數了。

輸入格式:

輸入首先給出一個正整數N(≤105),隨后給出N行指令。每行指令的格式為:“命令符(空格)QQ號碼(空格)密碼”。其中命令符為“N”(代表New)時表示要新申請一個QQ號,后面是新帳戶的號碼和密碼;命令符為“L”(代表Login)時表示是老帳戶登陸,后面是登陸信息。QQ號碼為一個不超過10位、但大於1000(據說QQ老總的號碼是1001)的整數。密碼為不小於6位、不超過16位、且不包含空格的字符串。

輸出格式:

針對每條指令,給出相應的信息:

1)若新申請帳戶成功,則輸出“New: OK”;
2)若新申請的號碼已經存在,則輸出“ERROR: Exist”;
3)若老帳戶登陸成功,則輸出“Login: OK”;
4)若老帳戶QQ號碼不存在,則輸出“ERROR: Not Exist”;
5)若老帳戶密碼錯誤,則輸出“ERROR: Wrong PW”。

輸入樣例:

5
L 1234567890 myQQ@qq.com
N 1234567890 myQQ@qq.com
N 1234567890 myQQ@qq.com
L 1234567890 myQQ@qq
L 1234567890 myQQ@qq.com

輸出樣例:

ERROR: Not Exist
New: OK
ERROR: Exist
ERROR: Wrong PW
Login: OK
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,hm;
 6     char zl[5],mm[20];
 7     scanf("%d",&n);
 8     map<int,string> ma;
 9     for(int i=0;i<n;i++)
10     {
11         scanf("%s %d %s",zl,&hm,mm);
12         if(zl[0]=='L')
13         {
14             if(ma.find(hm)!=ma.end())
15                 if(ma[hm]==mm)//3
16                     printf("Login: OK\n");
17                 else//5
18                     printf("ERROR: Wrong PW\n");
19             else//4
20                 printf("ERROR: Not Exist\n");
21         }
22         if(zl[0]=='N')
23         {
24             if(ma.find(hm)==ma.end())//1
25             {
26                 ma[hm]=mm;
27                 printf("New: OK\n");
28             }
29             else//2
30                 printf("ERROR: Exist\n");
31         }
32     }
33     return 0;
34 }

7-12 約瑟夫環(25 分)

N個人圍成一圈順序編號,從1號開始按1、2、3......順序報數,報p者退出圈外,其余的人再從1、2、3開始報數,報p的人再退出圈外,以此類推。 請按退出順序輸出每個退出人的原序號。

輸入格式:

輸入只有一行,包括一個整數N(1<=N<=3000)及一個整數p。

輸出格式:

按退出順序輸出每個退出人的原序號,數據間以一個空格分隔,但行尾無空格。

輸入樣例:

在這里給出一組輸入。例如:

7 3

輸出樣例:

3 6 2 7 5 1 4
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 vector<int> v;
 4 int a[3005];
 5 int main()
 6 {
 7     int n,p,b=0,cnt=0,i=1;
 8     cin>>n>>p;
 9     while(1)
10     {
11         if(!a[i])
12         {
13             if(++b==p)
14             {
15                 v.push_back(i);
16                 b=0;a[i]=1;
17                 if(++cnt==n)break;
18             }
19         }
20         if(++i>n)i=1;
21     }
22     for(int i=0;i<v.size();i++)
23         printf("%d%c",v[i],i==v.size()-1?'\n':' ');
24     return 0;
25 }

7-13 家譜處理(30 分)

人類學研究對於家族很感興趣,於是研究人員搜集了一些家族的家譜進行研究。實驗中,使用計算機處理家譜。為了實現這個目的,研究人員將家譜轉換為文本文件。下面為家譜文本文件的實例:

John
  Robert
    Frank
    Andrew
  Nancy
    David

家譜文本文件中,每一行包含一個人的名字。第一行中的名字是這個家族最早的祖先。家譜僅包含最早祖先的后代,而他們的丈夫或妻子不出現在家譜中。每個人的子女比父母多縮進2個空格。以上述家譜文本文件為例,John這個家族最早的祖先,他有兩個子女RobertNancyRobert有兩個子女FrankAndrewNancy只有一個子女David

在實驗中,研究人員還收集了家庭文件,並提取了家譜中有關兩個人關系的陳述語句。下面為家譜中關系的陳述語句實例:

John is the parent of Robert
Robert is a sibling of Nancy
David is a descendant of Robert

研究人員需要判斷每個陳述語句是真還是假,請編寫程序幫助研究人員判斷。

輸入格式:

輸入首先給出2個正整數N(2N100)和M(100),其中N為家譜中名字的數量,M為家譜中陳述語句的數量,輸入的每行不超過70個字符。

名字的字符串由不超過10個英文字母組成。在家譜中的第一行給出的名字前沒有縮進空格。家譜中的其他名字至少縮進2個空格,即他們是家譜中最早祖先(第一行給出的名字)的后代,且如果家譜中一個名字前縮進k個空格,則下一行中名字至多縮進k+2個空格。

在一個家譜中同樣的名字不會出現兩次,且家譜中沒有出現的名字不會出現在陳述語句中。每句陳述語句格式如下,其中XY為家譜中的不同名字:

X is a child of Y
X is the parent of Y
X is a sibling of Y
X is a descendant of Y
X is an ancestor of Y

輸出格式:

對於測試用例中的每句陳述語句,在一行中輸出True,如果陳述為真,或False,如果陳述為假。

輸入樣例:

6 5
John
  Robert
    Frank
    Andrew
  Nancy
    David
Robert is a child of John
Robert is an ancestor of Andrew
Robert is a sibling of Nancy
Nancy is the parent of Frank
John is a descendant of Andrew

輸出樣例:

True
True
True
False
False
這里用map,每個兒子映射到自己父親
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,m,k;
 6     string s,F[105];//存父親
 7     map<string,string> fa;//映射父親
 8     cin>>n>>m;cin.get();
 9     for(int i=0;i<n;i++)
10     {
11         getline(cin,s);
12         k=count(s.begin(),s.end(),' ');
13         s=s.substr(k);
14         if(k==0)
15         {
16             fa[s]="NULL";//祖宗自己沒有父親
17             F[k]=s;//0個空格自己做為父親F[0],給2個空格的兒子用的
18         }
19         else
20         {
21             fa[s]=F[k/2-1];//2個空格父親為F[0],4個空格父親為F[1],以此類推
22             F[k/2]=s;//2個空格自己做為父親F[1],給4個空格的兒子用的
23         }
24     }
25     for(int i=0;i<m;i++)
26     {
27         int f=0;
28         string X,Y,P,a;
29         cin>>X>>a>>a>>P>>a>>Y;
30         if(P=="child")//X的父親是Y
31             if(fa[X]==Y)
32                 f=1;
33         if(P=="parent")//Y的父親是X
34             if(fa[Y]==X)
35                 f=1;
36         if(P=="sibling")
37             if(fa[X]==fa[Y])//X和Y父親相同(兄弟)
38                 f=1;
39         if(P=="descendant")//X的祖宗是Y
40         {
41             while(fa[X]!=Y&&fa[X]!="NULL")X=fa[X];//向上找Y,若找到或者遇到NULL則結束
42             if(fa[X]==Y)f=1;
43         }
44         if(P=="ancestor")//Y的祖宗是X
45         {
46             while(fa[Y]!=X&&fa[Y]!="NULL")Y=fa[Y];//向上找X,若找到或者遇到NULL則結束
47             if(fa[Y]==X)f=1;
48         }
49         printf("%s\n",f?"True":"False");
50     }
51     return 0;
52 }

7-14 社交網絡圖中結點的“重要性”計算(30 分)

在社交網絡中,個人或單位(結點)之間通過某些關系(邊)聯系起來。他們受到這些關系的影響,這種影響可以理解為網絡中相互連接的結點之間蔓延的一種相互作用,可以增強也可以減弱。而結點根據其所處的位置不同,其在網絡中體現的重要性也不盡相同。

“緊密度中心性”是用來衡量一個結點到達其它結點的“快慢”的指標,即一個有較高中心性的結點比有較低中心性的結點能夠更快地(平均意義下)到達網絡中的其它結點,因而在該網絡的傳播過程中有更重要的價值。在有N個結點的網絡中,結點vi​​的“緊密度中心性”Cc(vi​​)數學上定義為vi​​到其余所有結點vj​​ (ji) 的最短距離d(vi​​,vj​​)的平均值的倒數:

對於非連通圖,所有結點的緊密度中心性都是0。

給定一個無權的無向圖以及其中的一組結點,計算這組結點中每個結點的緊密度中心性。

輸入格式:

輸入第一行給出兩個正整數 N和M,其中N(N≤104)是圖中結點個數,順便假設結點從1到N編號;M(M≤105)是邊的條數。隨后的M行中,每行給出一條邊的信息,即該邊連接的兩個結點編號,中間用空格分隔。最后一行給出需要計算緊密度中心性的這組結點的個數K(K≤100)以及K個結點編號,用空格分隔。

輸出格式:

按照Cc(i)=x.xx的格式輸出K個給定結點的緊密度中心性,每個輸出占一行,結果保留到小數點后2位。

輸入樣例:

9 14
1 2
1 3
1 4
2 3
3 4
4 5
4 6
5 6
5 7
5 8
6 7
6 8
7 8
7 9
3 3 4 9

輸出樣例:

Cc(3)=0.47
Cc(4)=0.62
Cc(9)=0.35

這個題可以floyd過的(不知道為啥??10000ˆ3),這里用spfa,如果有1個點不能到Dist[i]=無窮直接返回0

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef pair<int,int> pii;
 4 const int N=10005,INF=0x3f3f3f3f;
 5 vector<pii> G[N];
 6 int Vis[N],Dist[N];
 7 int spfa(int s,int n)
 8 {
 9     memset(Vis,0,sizeof(Vis));
10     memset(Dist,INF,sizeof(Dist));
11     queue<int> Q;
12     Q.push(s);
13     Dist[s]=0;
14     while(!Q.empty())
15     {
16         int u=Q.front();Q.pop();
17         Vis[u]=0;
18         for(int i=0;i<G[u].size();i++)
19         {
20             int v=G[u][i].first;
21             int w=G[u][i].second;
22             if(Dist[v]>Dist[u]+w)
23             {
24                 Dist[v]=Dist[u]+w;
25                 if(!Vis[v])
26                 {
27                     Q.push(v);
28                     Vis[v]=1;
29                 }
30             }
31         }
32     }
33     int sum=0;
34     for(int i=1;i<=n;i++)
35         if(Dist[i]==INF)return 0;
36         else sum+=Dist[i];
37     return sum;
38 }
39 int main()
40 {
41     int n,m,u,v,k;
42     scanf("%d%d",&n,&m);
43     for(int i=0;i<m;i++)
44     {
45         scanf("%d%d",&u,&v);
46         G[u].push_back(pii(v,1));
47         G[v].push_back(pii(u,1));
48     }
49     scanf("%d",&k);
50     for(int i=0;i<k;i++)
51     {
52         scanf("%d",&u);
53         int sum=spfa(u,n);
54         printf("Cc(%d)=%.2f\n",u,sum==0?0.00:(n-1)*1.0/sum);
55     }
56     return 0;
57 }

7-15 周游世界(30 分)

周游世界是件浪漫事,但規划旅行路線就不一定了…… 全世界有成千上萬條航線、鐵路線、大巴線,令人眼花繚亂。所以旅行社會選擇部分運輸公司組成聯盟,每家公司提供一條線路,然后幫助客戶規划由聯盟內企業支持的旅行路線。本題就要求你幫旅行社實現一個自動規划路線的程序,使得對任何給定的起點和終點,可以找出最順暢的路線。所謂“最順暢”,首先是指中途經停站最少;如果經停站一樣多,則取需要換乘線路次數最少的路線。

輸入格式:

輸入在第一行給出一個正整數N(100),即聯盟公司的數量。接下來有N行,第i行(i=1,,N)描述了第i家公司所提供的線路。格式為:

M S[1] S[2] ⋯ S[M]

其中M(100)是經停站的數量,S[i](i=1,,M)是經停站的編號(由4位0-9的數字組成)。這里假設每條線路都是簡單的一條可以雙向運行的鏈路,並且輸入保證是按照正確的經停順序給出的 —— 也就是說,任意一對相鄰的S[i]和S[i+1](i=1,,M1)之間都不存在其他經停站點。我們稱相鄰站點之間的線路為一個運營區間,每個運營區間只承包給一家公司。環線是有可能存在的,但不會不經停任何中間站點就從出發地回到出發地。當然,不同公司的線路是可能在某些站點有交叉的,這些站點就是客戶的換乘點,我們假設任意換乘點涉及的不同公司的線路都不超過5條。

在描述了聯盟線路之后,題目將給出一個正整數K(10),隨后K行,每行給出一位客戶的需求,即始發地的編號和目的地的編號,中間以一空格分隔。

輸出格式:

處理每一位客戶的需求。如果沒有現成的線路可以使其到達目的地,就在一行中輸出“Sorry, no line is available.”;如果目的地可達,則首先在一行中輸出最順暢路線的經停站數量(始發地和目的地不包括在內),然后按下列格式給出旅行路線:

Go by the line of company #X1 from S1 to S2.
Go by the line of company #X2 from S2 to S3.
......

其中Xi是線路承包公司的編號,Si是經停站的編號。但必須只輸出始發地、換乘點和目的地,不能輸出中間的經停站。題目保證滿足要求的路線是唯一的。

輸入樣例:

4
7 1001 3212 1003 1204 1005 1306 7797
9 9988 2333 1204 2006 2005 2004 2003 2302 2001
13 3011 3812 3013 3001 1306 3003 2333 3066 3212 3008 2302 3010 3011
4 6666 8432 4011 1306
4
3011 3013
6666 2001
2004 3001
2222 6666

輸出樣例:

2
Go by the line of company #3 from 3011 to 3013.
10
Go by the line of company #4 from 6666 to 1306.
Go by the line of company #3 from 1306 to 2302.
Go by the line of company #2 from 2302 to 2001.
6
Go by the line of company #2 from 2004 to 1204.
Go by the line of company #1 from 1204 to 1306.
Go by the line of company #3 from 1306 to 3001.
Sorry, no line is available.

代碼

暫時還沒寫完


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM