2018 藍橋杯省賽 B 組模擬賽(五)

計蒜客藍橋杯省賽 B 組模擬賽網址  https://www.jisuanke.com/contest/1215
A題:矩陣求和
給你一個從 n×n 的矩陣,裏面填充 11 到 n×n 。例如當 nn 等於 33 的時候,填充的矩陣如下。
1 2 3
4 5 6
7 8 9
現在我們把矩陣中的每條邊的中點連起來,這樣形成了一個新的矩形,請你計算一下這個新的矩形的覆蓋的數字的和。比如,n = 3n=3 的時候矩形覆蓋的數字如下。
  2
4 5 6
  8
那麼當 nn 等於 101101 的時候,矩陣和是多少?
題意就是求正方形四條邊中點連接起來形成的新正方形裏面所有數的和 ,用等差數列列公式求,或者循環一個一個求,最後答案是26020201

B題:素素個數
用  0,1,2,3⋯7 這 8 個數組成的所有整數中,質數有多少個(每個數字必須用到且只能用一次)。
提示:以 00 開始的數字是非法數字。

當初看這個題的時候看成0到8了 求出來質數只有0個,(0加到8是三的倍數)。後來發現題讀錯了,,,

求一下0到7的全排列,再判斷這個數是不是素素就行了。。代碼忘記保存了 最後答案是2668。

C題:

連連看是一款非常有意思的遊戲。

我們可以把任意兩個在圖的在邊界上的相同的方格一起消掉,比如把兩個4消掉以後,

每次消掉兩個方格的時候,都有會獲得一個分數,第 i次消的分數爲 i× 方格的值。比如上面的消法,是第一次消,獲得的分數爲 1×4=4。
請你幫忙最優操作情況下,獲得的分數最多爲多少。
這個題我是手算的,目的就是先把值小的數消掉,當然最開始和他們的想法一樣 消掉(1,1)和(2,4)這兩個一。但是這樣還剩下兩個(2,2)和(3,2)這兩個一就至少要第四輪才能被消掉。 (想一想這個題作者就是想要讓大家是先消一進坑)。然後我就從2開始消了,下面是我的消法(2,1)(1,3)->(1,1)和(2,2)  (3,2)和(2,4)。。後面的消法就基本一樣了。。
最後答案是89

D題:快速冪
沒有循環,那很明顯是用遞歸實現。
#include <stdio.h>

int pw(int x, int y, int p) {
    if (!y) {
        return 1;
    }
    int res = pw(x*x,y>>1,p);
    if (y & 1) {
        res = res * x % p;
    }
    return res;
}
int main() {
    int x, y, p;
    scanf("%d%d%d", &x, &y, &p);
    printf("%d\n", pw(x, y, p));
    return 0;
}


E題:末尾零的個數

N! 末尾有多少個 000 呢?

N!=1×2×⋯×NN! = 1 \times 2 \times \cdots \times NN!=1×2××N

代碼框中的代碼是一種實現,請分析並填寫缺失的代碼。

只需要找到N的階乘裏面有多少個因子5,也就是能被多少個5整除。2和5組成10,2的因子一定比5的因子多。



#include <stdio.h>
int main() {
    int n, ans = 0;
    scanf("%d", &n);
    while (n) {
        ans += (n=n/5);
    }
    printf("%d\n", ans);
    return 0;
}

F題:藏寶圖


蒜頭君得到一張藏寶圖。藏寶圖是一個 10×1010 \times 1010×10 的方格地圖,圖上一共有 101010 個寶藏。有些方格地形太兇險,不能進入。

整個圖只有一個地方可以出入,即是入口也是出口。蒜頭君是一個貪心的人,他規劃要獲得所有寶藏以後才從出口離開。

藏寶圖上從一個方格到相鄰的上下左右的方格需要 111 天的時間,蒜頭君從入口出發,找到所有寶藏以後,回到出口,最少需要多少天。
這個題我用手畫的,然後再用手數,,,,,,,,
答案是48


不想寫了 。。。。。。。有毒。。寫到一半就崩潰,,沒來得及保存。。恢復網頁上面都沒有了。。。


G:棧的模擬
#include <stdio.h>
#include <math.h>
int main() {
    int aa[500100];
    int head=1,cnt=0,x,n;
    scanf("%d",&n);
    scanf("%d",&aa[1]);
    for(int i=2;i<=n;i++)
    {
        head++;
        scanf("%d",&aa[head]);
        while(1)
        {
            if(head==1)
            {
                break;
            }
            else if(aa[head]-aa[head-1]==1)
            {
                cnt++;
                head--;
                ///printf("head=%d %d\n",head,aa[head]);
            }
            else if(aa[head-1]-aa[head]==1)
            {
                cnt++;
                head--;
                aa[head]=aa[head+1];
            }

            else
            {
                break;
            }
        }
    }
    printf("%d\n",cnt);
    return 0;
}
H:蒜頭君下棋

蒜頭君喜歡下棋。最近它迷上了國際象棋。國際象棋的棋盤可以被當做一個 8×88\times 88×8 的矩陣,棋子被放在格子裏面(不是和中國象棋一樣放在線上)。

蒜頭君特別喜歡國際象棋裏面的馬,馬的移動規則是這樣的:橫着走兩步之後豎着走一步,或者橫着走一步之後豎着走兩步。例如,一匹馬在 (3,3)(3,3)(3,3) 的位置,則它可以到達的地方有 (1,2)(1,2)(1,2)(2,1)(2,1)(2,1)(1,4)(1,4)(1,4)(4,1)(4,1)(4,1)(5,2)(5,2)(5,2)(2,5)(2,5)(2,5)(5,4)(5,4)(5,4)(4,5)(4,5)(4,5) 八個地方。蒜頭君想要把整個棋盤都放上馬,並且讓這些馬不能相互攻擊(即任何一匹馬不能走一步之後就到達另一匹馬的位置)。蒜頭君當然知道在 8×88 \times 88×8 的棋盤上怎麼放馬,但如果棋盤變爲 n×mn \times mn×m 的,蒜頭君就不懂了。他希望你來幫忙他計算一下究竟能放多少匹馬。

輸入格式

共一行,兩個整數nnnmmm(1≤n,m≤1000 1 \leq n , m \leq 10001n,m1000),代表棋盤一共有 nnnmmm 列。

輸出格式

輸出一個整數,代表棋盤上最多能放的馬的數量。

樣例輸入1

2 4

樣例輸出1

4

樣例輸入2

3 4

樣例輸出2

6
#include <stdio.h>
#include <math.h>
int main() {
    int aa[500100];
    int head=1,cnt=0,x,n;
    scanf("%d",&n);
    scanf("%d",&aa[1]);
    for(int i=2;i<=n;i++)
    {
        head++;
        scanf("%d",&aa[head]);
        while(1)
        {
            if(head==1)
            {
                break;
            }
            else if(aa[head]-aa[head-1]==1)
            {
                cnt++;
                head--;
                ///printf("head=%d %d\n",head,aa[head]);
            }
            else if(aa[head-1]-aa[head]==1)
            {
                cnt++;
                head--;
                aa[head]=aa[head+1];
            }

            else
            {
                break;
            }
        }
    }
    printf("%d\n",cnt);
    return 0;
}

n和m其中一個等於2的最優放置方法
n和m都大於2的最優放置方法

I題:蒜頭君的數軸

今天蒜頭君拿到了一個數軸,上邊有 nnn 個點,但是蒜頭君嫌這根數軸不夠優美,想要通過加一些點讓它變優美,所謂優美是指考慮相鄰兩個點的距離,最多隻有一對點的距離與其它的不同。

蒜頭君想知道,他最少需要加多少個點使這個數軸變優美。

輸入格式

輸入第一行爲一個整數 n(1≤n≤105)n(1 \leq n \leq 10^5)n(1n105),表示數軸上的點數。

第二行爲 nnn 個不重複的整數 x1,x2,...,xn(−109≤xi≤109)x_1,x_2,...,x_n(-10^9 \leq x_i \leq 10^9)x1,x2,...,xn(109xi109),表示這些點的座標,點座標亂序排列。

輸出格式

輸出一行,爲一個整數,表示蒜頭君最少需要加多少個點使這個數軸變優美。

樣例輸入

4
1 3 7 15

樣例輸出

1

哎,,,這個題,我不會。。。。

J題:整數劃分

蒜頭君特別喜歡數學。今天,蒜頭君突發奇想:如果想要把一個正整數 nnn 分解成不多於 kkk 個正整數相加的形式,那麼一共有多少種分解的方式呢?

蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。

輸入格式

共一行,包含兩個整數 n(1≤n≤300)n(1 \leq n \leq 300)n(1n300)k(1≤k≤300)k(1 \leq k \leq 300)k(1k300),含義如題意所示。

輸出格式

一個數字,代表所求的方案數。

樣例輸入

5 3

樣例輸出

5
這是一個dp題,我手寫了好多組找出來的規律,而且這個題int是過不了的
#include <stdio.h>
int main()
{
    long long  dp[350][350];
    dp[0][0]=1;
    for(int i=1;i<=300;i++)
        dp[i][1]=1;
    for(int i=2;i<=300;i++)
    {
        for(int j=2;j<=i;j++)
        {
            dp[i][j]=dp[i][j-1];
            if(j>i-j)
                dp[i][j]+=dp[i-j][i-j];
            else
                dp[i][j]+=dp[i-j][j];
        }
    }
    long long  n,m;
    scanf("%lld%lld",&n,&m);
    if(m>n)
        m=n;
    printf("%lld\n",dp[n][m]);
    return 0;
}



     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章