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 的列表中,最後...