騰訊真題匯總

一、翻轉(zhuǎn)數(shù)列

小Q定義了一種數(shù)列稱為翻轉(zhuǎn)數(shù)列:給定整數(shù)nm, 滿足n能被2m整除。對(duì)于一串連續(xù)遞增整數(shù)數(shù)列1, 2, 3, 4...每隔m個(gè)符號(hào)翻轉(zhuǎn)一次, 最初符號(hào)為-。例如n = 8, m = 2,數(shù)列就是-1, -2, +3, +4, -5, -6, +7, +8;而n = 4, m = 1, 數(shù)列就是-1, +2, -3, +4。小Q現(xiàn)在希望你能幫他算算前n項(xiàng)和為多少。

import sys
while True:
    s = sys.stdin.readline().strip()
    if not s:
        break
    n, m = map(int, s.split(" "))
    print(n*m/2)

二、紙牌游戲

牛牛和羊羊正在玩一個(gè)紙牌游戲。這個(gè)游戲一共有n張紙牌,第i張紙牌上寫著數(shù)字ai。牛牛和羊羊輪流抽牌,牛牛先抽,每次抽牌他們可以從紙牌堆中任意選擇一張抽出,直到紙牌被抽完。他們的得分等于他們抽到的紙牌數(shù)字總和?,F(xiàn)在假設(shè)牛牛和羊羊都采用最優(yōu)策略,請你計(jì)算出游戲結(jié)束后牛牛得分減去羊羊得分等于多少。

解:先排序,然后牛牛抽index為奇數(shù)的牌,羊羊抽index為偶數(shù)的牌。

import sys
while True:
    n = sys.stdin.readline().strip()
    s = sys.stdin.readline().strip()
    if not n or not s:
        break
    l = list(map(int, s.split(' ')))
    l.sort(reverse = True)
    ans = 0
    for i in range(len(l)):
        if i % 2 == 0:
            ans += l[i]
        else:
            ans -= l[i]
    print(ans)

三、貪吃的小Q

小Q的父母要出差N天,走之前給小Q留下了M塊巧克力。小Q決定每天吃的巧克力數(shù)量不少于前一天吃的一半,但是他又不想在父母回來之前的某一天沒有巧克力吃,請問他第一天最多能吃多少塊巧克力?
輸入描述:每個(gè)輸入包含一個(gè)測試用例。每個(gè)測試用例的第一行包含兩個(gè)正整數(shù),表示父母出差的天數(shù)N (N <= 50000)和巧克力的數(shù)量M (N <= M <= 100000)
輸出描述:輸出一個(gè)數(shù)表示小Q第一天最多能吃多少塊巧克力。
\color{red}{輸入:3、7}
\color{red}{輸出:4}

解:小Q第一天最多吃m個(gè),因?yàn)橐还簿?code>m個(gè)巧克力。設(shè)小Q第一天吃的數(shù)量為i,將im往下不斷遞減,直到滿足條件為止:
(1)第n天吃的數(shù)量仍然大于1。此時(shí),只要m-total_n>0即可;
(2)在第count天之前吃的數(shù)量已經(jīng)等于1了。此時(shí),只要剩余的巧克力數(shù)量大于剩余的天數(shù),也就是m-total_k>n-count即可。

import sys
while True:
    s = sys.stdin.readline().strip()
    if not s:
        break
    n, m = map(int, s.split(" "))
    for i in range(m, 0, -1):
        eat = 0
        today = i
        count = 0
        while count < n and today > 1:
            count += 1
            eat += today
            today = (today+1)//2
        if m - eat >= n - count:
            print(i)
            break

四、小Q的歌單

小Q有X首長度為A的不同的歌和Y首長度為B的不同的歌,現(xiàn)在小Q想用這些歌組成一個(gè)總長度正好為K的歌單,每首歌最多只能在歌單中出現(xiàn)一次,在不考慮歌單內(nèi)歌曲的先后順序的情況下,請問有多少種組成歌單的方法。
輸入描述:每個(gè)輸入包含一個(gè)測試用例。每個(gè)測試用例的第一行包含一個(gè)整數(shù),表示歌單的總長度K (1 <= K <= 1000)。接下來的一行包含四個(gè)正整數(shù),分別表示歌的第一種長度A (A <= 10)和數(shù)量X (X <= 100)以及歌的第二種長度B (B <= 10)和數(shù)量Y (Y <= 100)。保證A不等于B。
輸出描述:輸出一個(gè)整數(shù),表示組成歌單的方法取模。因?yàn)榇鸢缚赡軙?huì)很大,輸出對(duì)1000000007取模的結(jié)果。
\color{red}{輸入:5enter 2、3、3、3}
\color{red}{輸出:9}

import sys
while True:
    K = sys.stdin.readline().strip()
    s = sys.stdin.readline().strip()
    if not K or not s:
        break
    A, X, B, Y = map(int, s.split(" "))
    K = int(K)
    ans = 0
    i = 0
    while i <= X and i*A <= K:
        rem = K - i*A
        if rem % B == 0:
            j = rem // B
            if j <= Y:
                count_i, count_j = 1, 1
                for p in range(X, X-i, -1):
                    count_i *= p
                for q in range(i, 0, -1):
                    count_i //= q
                for p in range(Y, Y-j, -1):
                    count_j *= p
                for q in range(j, 0, -1):
                    count_j //= q
                ans += count_i * count_j
        i += 1
    print(ans % 1000000007)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容