SGU 390 Tickets 數字dp,較難

2021-07-22 08:57:05 字數 1358 閱讀 9838

sgu 390 tickets

有一位售票員給乘客售票。對於每位乘客,他會賣出多張連續的票,直到已賣出的票的 編號的數字之和不小於給定的正數

k 。然後他會按照相同的規則給下一位乘客售票。初始時, 售票員持有的票的編號是從 l到

r 的連續整數。請你求出,售票員可以售票給多少位乘客。

資料規模:1≤

l≤r≤

1018,1

≤k≤1000

。這個題也挺難的。。。我覺得。

首先這個不能區間減法做了。我們需要在每一步時判斷上下限。

把乙個十進位制數的區間看成乙個十叉樹,每個分支代表乙個數字。用dp[pos][left][cur]表示列舉到第po

s 位,前一顆十叉樹剩下數字和為le

ft,且當前的十叉樹已得到的數字和為cu

r 時低位數字隨便選(非上下限情況)時構成數字和為

k 時可以賣出去的票數。

遞迴的終止po

s=−1

時,判斷le

ft+c

ur和k

的大小關係來決定能否在當前數字賣出去票。

#include 

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

int k, n, m, digitl[20], digitr[20], vis[20][200][1010];

ll l, r;

pairint> dp[20][200][1010];

pairint> dfs(int pos, int left, int cur, int limitl, int limitr)

if (!limitl && !limitr && vis[pos][cur][left]) return dp[pos][cur][left];

int low = limitl ? digitl[pos] : 0;

int high = limitr ? digitr[pos] : 9;

pairint> ret = make_pair(0, left), tmp;

for (int i = low; i <= high; ++i)

if (!limitl && !limitr)

return ret;

}int main()

while (r)

printf("%lld\n", dfs(m - 1, 0, 0, 1, 1).first);

}return

0;}

390 消除遊戲(python

題目 給定乙個從1 到 n 排序的整數列表。首先,從左到右,從第乙個數字開始,每隔乙個數字進行刪除,直到列表的末尾。第二步,在剩下的數字中,從右到左,從倒數第乙個數字開始,每隔乙個數字進行刪除,直到列表開頭。我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下乙個數字。返回長度為 n 的列表中...

python 實戰39 0的組合

題目內容 給定乙個包含若干個整數 可能存在重複整數 的列表,判斷其中是否存在三個元素a,b,c,使得a b c 0?找出所有滿足條件且不重複的這樣的三個數的組合。輸入格式 共一行,列表中元素以空格隔開。輸出格式 共一行,為不重複組合的個數,不存在這樣的組合就輸出0 輸入樣例 1 0 1 2 1 輸出...

LeetCode 390 消除遊戲

給定乙個從1 到 n 排序的整數列表。首先,從左到右,從第乙個數字開始,每隔乙個數字進行刪除,直到列表的末尾。第二步,在剩下的數字中,從右到左,從倒數第乙個數字開始,每隔乙個數字進行刪除,直到列表開頭。我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下乙個數字。返回長度為 n 的列表中,最後...