1. 程式人生 > >51nod 1009 數字1的數量【數位dp】

51nod 1009 數字1的數量【數位dp】

給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。
例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。
Input
輸入N(1 <= N <= 10^9)
Output
輸出包含1的個數
Input示例
12
Output示例
5
《《這篇寫的挺好的》》
思路:
數位dp入門一下,討論每個數位出現1的次數,比如12?34這個數統計百位1的個數:
如果 ?= 0,12 * 100;
如果 ?= 1,12 * 100 + 34;
如果 ?> 1,(12 + 1) * 100;

#include <cstdio>
#include <cstring> #include <algorithm> #include <cmath> using namespace std; int main() { int n, ans = 0, res = 0, cnt, ant = 1; scanf("%d", &n); while(n) { cnt = n % 10; n /= 10; if(cnt == 0) { ans += n * ant; } else
if(cnt == 1) { ans += n * ant + 1 + res; } else if(cnt > 1) { ans += (n + 1) * ant; } res += cnt * ant; ant *= 10; } printf("%d\n", ans); return 0; }

相關推薦

51nod 1009 數字1數量數位dp

給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。 例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。 Input 輸入N

51Nod-1009 數字1數量數位DP+記憶化搜尋

給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。 例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。 Input 輸入N(1 <= N <= 10^9) Output 輸出包

數位dp入門51nod 1009 數字1數量

給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。 N(1 <= N <= 10^9) dp[i] 表示 0 ~ (10 ^ i - 1) 中1的個數。 ten[i] 表示 10 ^ i 的值 pos 當前處理的位 num 當

51nod 1009 - 數字1數量 - [數位DP][模板的應用以及解釋]

限制 detail 記憶 long info 返回值 spa 答案 .cn 題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基準時間限制:1 秒 空間限制:131072 KB

51nod 1009 數字1數量數位DP

給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。Input輸入N(1 <= N <= 10^9)Output輸出包含1的個數Input示例

51Nod 1009 數字1數量

51nod using sync ret turn return clu csdn stream 具體題解發一下大佬的分析http://blog.csdn.net/wyg1997/article/details/52169036 1 #include <ios

51nod 1009 數字1數量 (統計1的總個數,好題)

給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。 例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。 Input 輸入N(1 <= N <= 10^9) Outp

[51NOD] 1009 數字1數量 [數學][詳解]

給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。 例如:n = 12,包含了5個1。1,10,12共包含3個1,11包含2個1,總共5個1。 Input 輸入N

51NOD 1009 數字1數量

 收藏  關注 給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。 例如:n = 12,包含了5個1。1,10,12共包含3個1,11包

bzoj 1833: [ZJOI2010]count 數字計數數位dp

struct ret include opera truct mes 計數 表示 cpp 非典型數位dp 先預處理出f[i][j][k]表示從後往前第i位為j時k的個數,然後把答案轉換為ans(r)-ans(l-1),用預處理出的f數組dp出f即可(可能也不是dp吧……)

BZOJ P1833 LOJ #10169. 「ZJOI2010」數字計數數位DP

現在看來比較簡單了: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm

ural 1057 Amount of degrees 數位dp

ont ++ algorithm printf pre turn blog _id 數位dp 題意:求(x--y)區間轉化為 c 進制 1 的個數為 k 的數的出現次數。 分析:發現其滿足區間減法,所以能夠求直接求0---x 的轉化為 c 進制中

數位DPHDU 6156 Palindrome Function

amp int namespace bfd spl names name clu esp http://acm.hdu.edu.cn/showproblem.php?pid=6156 【AC】 1 #include<bits/stdc++.h> 2 us

數位dphdu2089 不要62

clu scanf spa print algo std can dfs fin 好吧,雖然是道水題但是是第一次接觸數位dp所以還是要記錄一下。 其實就是因為如果按數的大小枚舉的話很不方便所以就按數位枚舉並進行記憶化。 #include<iostream> #

BZOJ2425 [HAOI2010]計數 數位dp

cpp urn 所有 namespace HA div n) != haoi2010 題目 你有一組非零數字(不一定唯一),你可以在其中插入任意個0,這樣就可以產生無限個數。比如說給定{1,2},那麽可以生成數字12,21,102,120,201,210,1002,1020

UOJ275 [清華集訓2016] 組合數問題 Lucas定理數位DP

++ first size dfs ns2 \n spa sca mod 題目分析: 我記得很久以前有人跟我說NOIP2016的題目出了加強版在清華集訓中,但這似乎是一道無關的題目? 由於$k$為素數,那麽$lucas$定理就可以搬上臺面了。 註意到$\binom{i}{j

bzoj 3209: 花神的數論題數位dp

clas tail code 花神的數論題 turn a* names blog nsh 參考:https://blog.csdn.net/sunshinezff/article/details/51049132 非典型數位dp 首先預處理,設f[i][j]為以0開頭的i位

BZOJ 1026 windy數數位DP

ctype ret += pac rst true bug ring fine 1026: [SCOI2009]windy數 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 10142 Solved: 4712[Subm

數位DP題集

狀態 轉移 位置 長度 數位 一次 是否 php 統計 1.HDOJ2089 題意:求區間內不出現4和62的數的個數 解法:模板題 2.HDOJ3555 題意:求區間內不出現49的數的個數 解法:模板題 3.HDOJ5179 題意:對於一個十進制數,把每一位拆出來變成一個數

bzoj 3598: [Scoi2014]方伯伯的商場之旅數位dp

scan clu cpp ems turn htm main ostream spa 參考了這個http://www.cnblogs.com/Artanis/p/3751644.html,好像比一般方法好寫 大概思想就是先計算出把所有石子都合並到1位置的代價,這樣顯然有一些