1. 程式人生 > >中石油 2018-2019賽季多校聯合新生訓練賽第一場

中石油 2018-2019賽季多校聯合新生訓練賽第一場

問題 A: 錄取分數線
題目描述
新學年,學校將成立資訊學興趣小組提高班。由於指導教師精力有限,只能以選拔考試的成績為依據,按從高到低的分數,從N個參加選拔的學生中錄取不超過M個成員。錄取的成員要儘可能地多,但不得超過M個(含M個)。由於可能會有並列分數出現,為了保證公平,有時只得忍痛割愛,可能錄取的成員會達不到計劃數M。請你程式設計劃定錄取分數線。
輸入有N+1行,第一行是報名人數N和錄取人數M。以下N行是考試成績,已按從高到低的順序排列。N、M和成績均是1000以內的正整數,N≥M。資料保證不會所有的成績都相同。
輸出只有1行,為錄取分數線。
樣例輸入複製樣例資料

10 5
99
98
97
96
95
94
93
92
91
90
樣例輸出
95

問題 B: 電子警察時間

題目描述
現在很多地方的道路路口都安裝了電子警察,即交通違章自動拍照系統。這些系統一般在路口的地下埋設感應線圈,通過感測器判斷汽車是否在紅燈時通過路面,來控制數碼相機自動拍照。在安裝這種系統需要挖掘地面,施工麻煩,成本又高。於是有人研究出了同攝像機自動識別車牌並判斷違章行為的系統,這樣一來,電子警察安裝就方便多了,成本也大大降低。請你程式設計實現其中的一個功能,給出一批某一時間識別後的車牌號碼及行進方向,判斷該車是否違章,並記錄下來。違章的規則設定為:先設定左轉、直行、右轉依次綠燈通行時間(以秒為單位,只允許一個方向綠燈),先左轉綠燈,然後直行綠燈,最後右轉綠燈,在其中一個綠燈時,其餘兩盞燈為紅燈狀態,假設時間生效在零時整,且給出的資料只限定當天。闖紅燈為違章。
輸入第1行有4個整數,以一個空格隔開,依次為左轉、直行、右轉通行的綠燈持續秒數和識別的車輛數N(1≤N≤10000),後面的N行,表示每輛車的資訊,格式為“時間+方向+車牌”,其中時間為6位數字,方向為1個字母(L表示左轉,S表示直行,R表示右轉),車牌為8個字元,之間沒有空格。如081528LZJBB0001,表示車牌號為ZJBB0001的車輛在8時15分28秒左轉。
輸出違章車輛的車牌號碼,每輛車一行,不含空格,按輸進去的先後順序輸出。

樣例輸入複製樣例資料
15 30 20 3
000046SZJBB8888
030950LJSAA9999
201509RBJC7777D
樣例輸出
ZJBB8888
BJC7777D

問題 C: 查詢特定的合數

題目描述
自然數中除了能被1和本身整除外,還能被其他數整除的數叫合數。每個合數都可以寫成幾個質數相乘的形式,這幾個質數都叫做這個合數的質因數。比如8=2×2×2,2就是8的質因數。在1—N(N≤200000)按從小到大順序排列的自然數序列中,查詢第M個有X(2≤X≤6)個不同質因數的合數。例如,第3個有2個不同質因數的合數是12(12只有2、3兩個不同的質因數,在12之前有2個不同質因數的合數分別為6和10)。
輸入共1行,分別為M,X。
輸出共1行,為第M個有X個不同質因數的合數。
樣例輸入複製樣例資料
3 2
樣例輸出
12

問題 D: 傳話遊戲
題目描述有這樣一個朋友網路,如果a認識b,那麼a收到某個訊息,就會把這個訊息傳給b,以及所有a認識的人。但是,請你注意,如果a認識b,b不一定認識a。現在我們把所有人從1到n編號,給出所有“認識”關係,問如果i釋出一條新訊息,那麼會不會經過若干次傳話後,這個訊息傳回給了i(1≤i≤n)。
輸入第1行是兩個數n(n<1000)和m(m<10000),兩數之間有一個空格,表示人數和認識關係數。接下來的m行,每行兩個數a和b,表示a認識b(1≤a,b≤n)。認識關係可能會重複給出,但1行的兩個數不會相同。
輸出一共有n行,每行一個字元T或F。第i行如果是T,表示i發出一條新訊息會傳回給i;如果是F,表示i發出一條新訊息不會傳回給i。
樣例輸入複製樣例資料

4 6
1 2
2 3
4 1
3 1
1 3
2 3
樣例輸出
T
T
T
F

問題 E: 誰是冠軍
題目描述
小Q自從參加某小學計算機興趣小組以來,對程式設計產生了濃厚的興趣。他發現用計算機程式設計不但可以訓練思維,還可以解決學習和生活中的一些實際問題。比如,世界盃足球賽時,小Q就經常把其中的一些球隊列出來,組成一個小團隊,然後根據規則計算積分,並根據積分的高低看看這個團隊內誰是冠軍。假如某次足球賽的積分規則如下:每勝一局得3分,每平一局得1分,每輸一局扣1分,積分最高者為冠軍。小Q就想編這樣一個程式,輸入若干球隊的成績,就能自動求出這個團隊中誰是冠軍。你也能編一個嗎?
輸入輸入有兩行,第一行是輸入的球隊數,第二行是每隊的比賽成績,依次為球隊編號、勝局數、平局數、負局數(均為小於1000的整數),每個資料間用一空格隔開。輸入的資料保證積分各不相同。
輸出只有一個數,就是冠軍隊的編號。
樣例輸入複製樣例資料

4
1 5 4 3
2 3 4 5
3 6 3 3
4 4 2 6
樣例輸出
3

#include<stdio.h>
int main()
{
 int i,j,n,m,q,max;
 int a[1000][5];
 scanf("%d",&n);
 for(i=0;i<n;i++)
 {
  for(j=0;j<4;j++)
  {
   scanf("%d",&a[i][j]);
  }
  a[i][4]=a[i][1]*3+a[i][2]-a[i][3];
 }
 max=a[0][4];
 q=0;
  for(i=1;i<n;i++)
  {
  if(max<a[i][4])
  {
   max=a[i][4];
   q=i;
  }
  }
  printf("%d\n",a[q][0]);
  return 0;
}

問題 F: 搭積木的訣竅
題目描述
小Q的程式設計技術在一次搭積木比賽中也成了祕密武器。原來,比賽的規則是這樣的:給你N個小木塊(全部為一樣大小的正方體),快速搭成如下圖規則的形狀(下圖為5層的規模),要求層數為最大限度。由於小Q編了個程式,只要輸入小木塊個數N,就可以馬上求出最多可以搭幾層,還剩幾個,所以小Q每次都是一次成功,從不需要翻工,速度也就領先了。你會編小Q這樣的程式嗎?
在這裡插入圖片描述
輸入只有一個整數N,表示小木塊的個數,已知1≤N≤30000。
輸出有兩行整數,第一行是最多可以堆的層數,第二行是剩餘的小木塊數。
樣例輸入複製樣例資料
37
樣例輸出5
2

#include<stdio.h>
int main()
{
 int i=0,j,n,sum1,sum2;
 scanf("%d",&n);
 for(i=1,j=1,sum1=0,sum2=0;i<30000;i++)
 {
  sum1=sum1+j;
  sum2=sum2+sum1;
  j++;
  if(sum2>n)
  {
   sum2=sum2-sum1;
   i=i-1;
   break;
  }
 }
 printf("%d\n%d\n",i,n-sum2);
 return 0;
}

問題 G: 卡布列克常數
題目描述
最近,小Q在數學興趣課中瞭解了“卡布列克常數”。卡布列克是一位數學家,他在研究數字時發現:任意一個不是用完全相同數字組成的四位數,如果對它們的每位數字重新排序,組成一個最大的數和一個最小的數,然後用最大數減去最小數,差不夠四位數時補零,類推下去,最後將變成一個固定的數:6174,這就是卡布列克常數。

例如:4321-1234=3087
8730-378=8352
8532-2358=6174
7641-1467=6174
小Q想,我能不能程式設計來驗證呢?輸入一個符合條件的四位數,然後驗證運算過程。
輸入共1行,為任意一個不是用完全相同數字組成的四位數。
輸出變為卡布列克常數的運算過程,由若干行組成,每行是一個算式,不含空格。
樣例輸入複製樣例資料
4321
樣例輸出4321-1234=3087
8730-378=8352
8532-2358=6174

#include<stdio.h>
int main()
{
 void q(int);
 int n;
 scanf("%d",&n);
 q(n);
 return 0;
}
void q(int n)
{
 int m,d,t,i,j;
 int a[4],b[4];
 b[0]=n%10;b[1]=n/10%10;b[2]=n/100%10;b[3]=n/1000;
  for(i=0;i<3;i++)
   for(j=0;j<3-i;j++)
    if(b[j]<b[j+1])
    {
     t=b[j];
     b[j]=b[j+1];
     b[j+1]=t;
    }
    n=b[0]*1000+b[1]*100+b[2]*10+b[3];
 m=n%10*1000+n/10%10*100+n/100%10*10+n/1000;
 if(n<m)
 {
  t=n;
  n=m;
  m=t;
 }
 d=n-m;
 printf("%d-%d=%d\n",n,m,d);
 if(d!=6174)
 {
  a[0]=d%10;a[1]=d/10%10;a[2]=d/100%10;a[3]=d/1000;
  for(i=0;i<3;i++)
   for(j=0;j<3-i;j++)
    if(a[j]<a[j+1])
    {
     t=a[j];
     a[j]=a[j+1];
     a[j+1]=t;
    }
  d=a[0]*1000+a[1]*100+a[2]*10+a[3];
  q(d);
 }
 else
  return 0;
}

問題 H: 掃雷遊戲
題目描述
小Q空的時候挺喜歡玩玩電腦遊戲的。自從程式設計技術提高後,他就想,要是自己也能開發出一款遊戲來,那該多好啊!不過,小Q也不著急,先練好基本功再說。Windows中就有一款叫掃雷的小遊戲,挺好玩的,不過想編出一個來,還真不容易。小Q就自己設想了一種簡單的掃雷遊戲:在n行2列的方格棋盤上,左列某些方格內埋有地雷,而右列每個方格中都有一個數字(0~3),第I格的數字表示:左列第I-1、I、I+1格(即:上、中、下三格)中埋雷的總數。如下所示:左圖是初始狀態,右圖是掃雷完成狀態(插小旗的方格內有雷)。
你的任務是:根據右列的數字分析出左列格子中的地雷(0表示無雷,1表示有雷),並且統計出左列格子中地雷的總數。
小Q想,如果這樣的任務能完成了,相信編出更復雜的掃雷遊戲也就為期不遠了。
輸入第一行,一個整數N(2≤N≤40),第二行有N個數字(以一個空格相隔),表示右列格子中的數字。輸入資料保證正確有解。
輸出第一行是N個0、1數字(沒有空格相隔),表示左列每格中有無地雷。第二行一個整數,表示地雷總數。
樣例輸入複製樣例資料
7
1 2 3 2 2 2 2
樣例輸出0111011
5