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

2018-2019賽季多校聯合新生訓練賽第四場

問題 A: 數一數時間限制: 1 Sec 記憶體限制: 128 MB
題目描述
星期天早上,小明開始做數學家庭作業。因為小明成績很優異,覺得題目太簡單了,思考出道難點的數學題去學校考考同學,他注意到:數學書的第10頁和第11頁在同一張紙上,但第11頁和第12頁不在同一張紙上。
哈哈,題目有了,請問數學書的第x頁到第y頁共有多少張紙呢?
例如:該書的第81頁到第92頁,共有7張紙。
輸入一行兩個數x、y如題所述,用空格隔開。
輸出一個數,表示紙張數。
樣例輸入複製樣例資料
81 92
樣例輸出7
提示50%:0<y-x<=15;
100%:1<=x,y<=longint;0<y-x<longint。

#include<stdio.h>
int main()
{
 int x,y;
 scanf("%d%d",&x,&y);
 if(x%2==0&&y%2==0||x%2!=0&&y%2!=0)
  printf("%d\n",(y-x)/2+1);
 if(x%2!=0&&y%2==0)
  printf("%d\n",(y-x)/2+2);
 if(x%2==0&&y%2!=0)
  printf("%d\n",(y-x)/2+1);
 return 0;
}

問題 B: 博物館時間限制: 1 Sec 記憶體限制: 128 MB
提交: 566 解決: 192
題目描述
從前,有一個偌大的博物館,每天都會有數以萬計的人們來參觀,欣賞這裡的藝術作品。這一天,博物館來了N批人,第i批人有Ai個人以及一個導遊組成,他們依次到達,但同時也有一些批次的人離開,由於人次太多,博物館的管理人員遞給你一些人數表,就請你來統計一下剩下多少人。
輸入第一行是個整數N,接下來N行。每行兩個數,第一個數X,如果X=0則後面接一個數Ai,表示來了Ai個人;如果X=1,那麼接下來就有一個數Y,表示來的人中的第Y批離開了。
輸出一個數,表示剩下多少人。
樣例輸入複製樣例資料

6
0 5
0 6
1 1
0 7
0 8
1 3
樣例輸出16

提示有四批人,每批人要加上一位導遊,分別是6,7,8,9人,離開的是第1和3批,即走了6+8=14人,剩7+9=16人。

對於30%的資料,1≤N≤100,1≤Ai≤1000;
對於100%的資料,1≤N≤1000000,1≤Ai≤1000000。
保證:X只為0或1,Y一定符合要求。

#include<stdio.h>
int a[1000001][2],b[1000001];
/*在main函式中定義是不行的,
 C中定義整形陣列長度為1000000只能有兩種方法,
1是宣告一個全域性陣列,2是在需要的函式中用malloc函式動態申請*/
int main()
{
 int i,n,k=1,sum=0;
 scanf("%d",&n);
 for(i=1;i<=n;i++)
 {
  scanf("%d%d",&a[i][0],&a[i][1]);
  if(a[i][0]==0)
  {
   b[k]=a[i][1]+1;
   k++;
   sum=sum+a[i][1]+1;
  }
  else
   sum=sum-b[a[i][1]];
 }
 printf("%d\n",sum);
 return 0;
}
這個題主要是卡到了陣列定義上

問題 C: 旅遊時間限制: 1 Sec 記憶體限制: 128 MB
提交: 532 解決: 199
題目描述
Lanlan的好朋友Qiqi來到了東莞,她決定帶Qiqi去東莞的名勝景區旅遊,以此增進友誼。但Qiqi不喜歡去擁擠度大於k的景點,而且旅遊的時間不能是斷開的。Lanlan現在知道了明天n個連續時間景區的擁擠度,她想知道她最多能陪Qiqi旅遊多久。
輸入第一行兩個整數n,k。
第二行有n個整數表示每個時間的擁擠程度(數值小於1000)。
輸出一個整數表示Lanlan最多能陪Qiqi的時間。
樣例輸入複製樣例資料
20 2
1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
樣例輸出16

提示60%的資料 N<=1000

100%的資料 N<=100000

借用別人的題解,還沒學C++,尷尬
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main() {
  int maxn=-1;
  int n,k;
  cin>>n>>k;
  for(int i=0;i<n;i++) {
    cin>>a[i];
  }
  int sum=0;
  for(int i=0;i<n;i++) {
    if(a[i]<=k)
    sum++;
    else
    sum=0;
    maxn=max(maxn,sum);
  }
  cout<<maxn;
}

問題 D: 17倍時間限制: 1 Sec 記憶體限制: 128 MB
提交: 458 解決: 55
題目描述學習程式設計的Lanlan記得老師給她佈置的第一個任務是:輸入一個數N,然後輸出17N的值。當然這個任務非常簡單,經過一段時間的學習,蘭蘭有了一些的進步,老師又佈置了一個類似的任務,只是變更了一個條件,輸入的N是一個二進位制數,輸出的值也要是二進位制表示的。
現在請幫助Lanlan完成這個任務。
輸入一個二進位制表示的數N。
輸出二進位制表示的17
N。
樣例輸入複製樣例資料
10110111
樣例輸出110000100111
提示10110111相當於十進位制的183,於是183*17=3111,二進位制形式是110000100111。
30%的資料N的位數小於25位
50%的資料N的位數小於50位
100%的資料N的位數小於1000位

#include<stdio.h>
#include<string.h>
#include<math.h>
int b[1000000];
int main()
{
 long long int d,i,n,sum=0;
 char a[1000];
 scanf("%s",&a);
 n=strlen(a);
 d=n;
 for(i=0;i<n;i++)
 {
  sum=sum+pow(2,d-1)*(a[i]-48);
   d--;
 }
 sum=sum*17;
 i=0;
 while(sum>0)
 {
  b[i]=sum%2;
  i=i+1;
  sum=sum/2;
 }
 for(i--;i>=0;i--)
  printf("%d",b[i]);
 printf("\n");
 return 0;
}
沒通過,因為N是1000,所以可能最後數值很大,即使long long 也不行,但不知道為什麼,這個適合小資料的

問題 E: 約數國王時間限制: 1 Sec 記憶體限制: 128 MB
提交: 86 解決: 6
題目描述
數學的王國裡,有一些約數國王……約數國王的定義是這樣的:一個大於1的整數n,如果它約數的個數比1~n-1的每個整數的約數的個數都要多,那麼我們就稱它為約數國王。聰明的小明在奧數書上認識了它們,於是產生了一個問題:他想知道L到R之間一共有多少個約數國王?它們分別又是誰?
輸入只有一行,包含一個l,一個r,表示小明想知道的範圍。
輸出只有一行,第一個數h,表示l~r內一共有多少個約數國王,接下來h個從小到大的數(為了防止國王們打架,你需要按順序輸出。),表示約數國王分別是誰。
樣例輸入複製樣例資料
1 100
樣例輸出8 2 4 6 12 24 36 48 60
提示對於30%的資料,1<=l<=r<=200000。
對於50%的資料,1<=l<=r<=500000。
對於70%的資料,保證最大的約數國王的約數的個數不大於1000。
對於100%的資料,1<=l<=r, 並且保證l,r在64位整型以內,最大的約數國王的約數的個數不大於200000。

目前暫時解決不了

問題 F: 移動石子時間限制: 1 Sec 記憶體限制: 128 MB
提交: 259 解決: 156
題目描述
期待已久的“清明”假期終於到了。清明節是中華民族幾千年來留下的優良傳統,它有利於弘揚孝道親情,喚醒家庭共同記憶,促進家庭成員乃至民族的凝聚力和認同感。
小學生卡卡西非常高興,因為清明前後正是踏青的好時光,他終於可以和小夥伴們一起出去踏青了!然而,天公不作美,假期的第一天就下起了雨,卡卡西只能放棄出遊計劃,待在家裡。
期間,無聊的卡卡西和小夥伴玩了一個博弈遊戲:
在一個給定的 n×n 的棋盤上,有一個石頭被放在棋盤的左上角。他們輪流移動石頭。每一回合,每個人只能把石頭向上,下,左,右四個方向移動一格,並且要求移動到的格子之前不能被訪問過。誰不能移動石頭了就算輸。假如小卡卡西先移動石頭,而且兩人都以最優策略走步,問最後誰能贏?
輸入輸入有多組資料。
輸入第一行包含一個整數n,表示棋盤的規模。
當輸入n為0時,表示輸入結束。
輸出對於每組資料,如果小卡卡西最後能贏,則輸出“Kakashi”,否則輸出“Lost”,每一組答案獨佔一行。
樣例輸入複製樣例資料
2
0
樣例輸出Kakashi
提示對於20%的資料,保證1<=n<=10;
對於40%的資料,保證1<=n<=1000;
對於所有的資料,保證1<=n<=10000。

#include<stdio.h>
int main()
{
 int n;
 while(scanf("%d",&n)!=EOF)
 {
  if(n==0)
   break;
  if(n%2==0)
   printf("Kakashi\n");
  else
   printf("Lost\n");
 }
 return 0;
}
這個題目就是奇數就會輸,偶數就會贏

問題 G: 列車線路
題目描述
終於,卡卡西來到了一個叫“位元蘭”的國家,“位元蘭”是個很發達的國家,有著非常高科技的列車,和非常複雜的列車線路。具體來說,從理論上,我們可以假設這個國家的高科技列車可以不消耗時間的從A地瞬間轉移到B地。同時,鐵路線路複雜到,每對城市之間都有列車連線。但是不幸的是,由於這種列車執行需要很多維護工作,所以每天只能發出一次。從i到j的列車(i≠j)會在ti,j時間發出(保證ti,j兩兩不同)。
如果有一條路徑連結A和B兩個城市,並且滿足路徑上的每⼀條邊的發車時間單調遞增(也就是說經過的每段鐵路的發出時間都要大於上一段的,因為我們需要從上一段鐵路換乘下一段鐵路)。現在“位元蘭”的鐵路局想要知道,一天之內,對於每一對i和j,如果想要從i到達j,最早多早能到達呢?
輸入
第一行一個整數n。
接下來n行,每行n個整數。表示ti,j。(i=j時保證ti,j=0,不算一條線路)
輸出
n行,每行n個整數ansi,j,表示從i到j最早的到達時間。(i=j的時候ansi,j=0)
樣例輸入
複製樣例資料 3
0 4 5
2 0 3
1 6 0
樣例輸出
0 4 5
2 0 3
1 4 0
提示
對於20%的資料,n<=10
對於40%的資料,n<=20
對於60%的資料,n<=50
對於100%的資料,n<=500,ti,j<=109

目前暫時解決不了

問題 H: 搭積木時間限制: 1 Sec 記憶體限制: 128 MB
提交: 14 解決: 4
題目描述
積木對於大家來說應該很熟悉,我們可以用積木搭建出各種各樣的模型,不同的人搭建出來的模型也會不一樣。這不,小卡卡西正在和一群小夥伴玩積木呢!
鐵人老師看見小朋友們在玩積木,就給大家出了一個難題:
給定一些方形的積木,積木的三維尺寸分別為正整數Xi,Yi,Zi,每一種積木
都可以認為是無限多個。並且在搭建過程中約定如下條件:
1.搭建的模型每一層只能用一個積木;
2.模型的每一層的積木的底面必須小於它的下層,當然積木的底面可以是6個面中的任一個。
那麼要如何搭建,才能使模型最高呢?
輸入第一行一個數N,表示不同積木的種數(N<=1000)
以下N行,每一行描述一種積木。
Xi、Yi、Zi(<=100)分別為三邊的長度
輸出一行一個數M,表示在給定的條件下能搭建的最高模型的高度。
樣例輸入複製樣例資料
1
10 20 30
樣例輸出40

目前暫時解決不了

問題 I: 幸運數字III時間限制: 1 Sec 記憶體限制: 128 MB
提交: 639 解決: 221
題目描述
小李非常喜歡數字4和7,看到一個數字他就想快速計算出因子裡面分別有幾個4和7,但是智商捉急的他總是要算很久,喜歡程式設計的你能夠幫助他嗎?
輸入第一行一個整數n(3<=n<=2^60),表示給定的數字。
輸出兩個用空格隔開的數字,分別表示給定數字的因子中4和7的個數。
樣例輸入複製樣例資料
112
樣例輸出2 1
提示112=447

#include<stdio.h>
int main()
{
 long long int n,a[2]={0};
 scanf("%lld",&n);
 while(1)
 {
  if(n%4==0)
  {
   a[0]++;
   n=n/4;
  }
  else
   break;
 }
 while(1)
 {
  if(n%7==0)
  {
   a[1]++;
   n=n/7;
  }
  else
   break;
 }
 printf("%lld ",a[0]);
    printf("%lld\n",a[1]);
 return 0;
}

5779: 英雄卡時間限制: 1 Sec 記憶體限制: 128 MB
提交: 776 解決: 136
題目描述
小李非常迷戀收集各種乾脆面裡面的英雄卡,為此他曾經連續一個月都只吃乾脆面這一種零食,但是有些稀有英雄卡真的是太難收集到了。後來某商場搞了一次英雄卡兌換活動,只要你有三張編號連續的英雄卡,你就可以換任意編號的英雄卡。小李想知道他最多可以換到幾張英雄卡(新換來的英雄卡不可以再次兌換)。
輸入第一行,共一個整數n(1<=n<=10000),表示小李擁有的英雄卡數。
第二行,共n個空格隔開的數字ai(1<=ai<=100000),表示英雄卡的編號。
輸出輸出僅有一行,共1個整數,表示小李最多可以換到的英雄卡。
樣例輸入複製樣例資料
6
3 1 2 4 4 5
樣例輸出1
提示1 2 3三張編號連續,可以換一張,換完後剩下4 4 5,不符合兌換規則,無法繼續兌換。

#include<stdio.h>
int a[100000];
int main()
{
 int n,i,t,sum=0;
 int x,y,z,max;
 scanf("%d",&n);
 for(i=0;i<n;i++)
 {
  scanf("%d",&t);
  a[t]++;
 }
 for(i=0;i<n;i++)
 {
  if(a[i]!=0&&a[i+1]!=0&&a[i+2]!=0)
  {
   x=a[i];y=a[i+1];z=a[i+2];
            max=x;
      if(max>y)
     max=y;
   if(max>z)
     max=z;
   sum=sum+max;
   a[i+2]-=max;
   a[i+1]-=max;
   a[i]-=max;
  }
 }
 printf("%d\n",sum);
 return 0;
}

貴有恆,何必三更起五更眠;最無益,莫過一日曝十日寒。
問題 K: 最強陣容時間限制: 1 Sec 記憶體限制: 128 MB
提交: 383 解決: 95
題目描述
拿著新換來的英雄卡,小李滿心歡喜的準備和同學們PK一下。
他們的遊戲規則非常簡單,雙方把自己的牌繞成一圈,然後指定一個起點,從該張牌開始順時針方向往後取,誰取出的字串字典序更小(從左到右開始比較,碰到第一個不一樣的字元進行比較,比較規則為a<b<…<z)誰將獲得勝利。具體規則可參考樣例。雖然現在小李的牌已經很好了,但是你能不能幫他快速算出起始位置,使得他能夠派出最強陣容。
輸入第一行n(1<=n<=30000),表示共有n張牌。
第二行共n個用一個空格隔開的小寫字母,表示給定的一圈牌起始序列。
輸出僅一個整數,能獲得最小字典序字串的起點位置。如果有多個位置開始的字串一樣,則輸出最小的那個位置,且第一個位置從1開始。
樣例輸入複製樣例資料
4
b c a b
樣例輸出3
提示四個位置取出的字串分別為bcab,cabb,abbc,bbca,顯然最小位置是3。

待續

問題 L: 最強素數時間限制: 1 Sec 記憶體限制: 128 MB
提交: 193 解決: 49
題目描述小李在你幫助之下輕鬆戰勝了他的同學們,於是滿懷惡意的同學出了一個題目來為難小李,作為小李神一樣的隊友,你又要出力了。
素數41能寫成連續6個素數之和:41=2+3+5+7+11+13。
現在要求n以內的素數中,能表示為最多連續素數之和的那個數,如果有多個答案,請輸出最大的那個素數。
輸入僅一行,一個整數n(1<=n<=1000000)。
輸出輸出就一個整數,為所求的能表示為最多連續素數和的那個素數。
樣例輸入複製樣例資料
100
樣例輸出41
提示41=2+3+5+7+11+13

待續