• [HDU3555]Bomb


    [HDU3555]Bomb

    试题描述

    The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "49", the power of the blast would add one point.
    Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?

    输入

    The first line of input consists of an integer T (1 <= T <= 10000), indicating the number of test cases. For each test case, there will be an integer N (1 <= N <= 2^63-1) as the description.

    The input terminates by end of file marker.

    输出

    For each test case, output an integer indicating the final points of the power.

    输入示例

    3
    1
    50
    500

    输出示例

    0
    1
    15

    数据规模及约定

    见“输入

    题解

    裸数位 dp,f[i][j] 表示前 i 位最高位为数字 j 的数中,包含“49”的个数。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <cstring>
    #include <string>
    #include <map>
    #include <set>
    using namespace std;
    #define LL long long
    
    LL read() {
        LL x = 0, f = 1; char c = getchar();
        while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
        while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
        return x * f;
    }
    
    #define maxn 21
    LL f[maxn][maxn], ten[maxn];
    
    int num[maxn], cnt;
    LL sum(LL x) {
    	cnt = 0; LL orx = x;
    	while(x) num[++cnt] = x % 10, x /= 10;
    	LL sum = 0;
    	for(int i = cnt; i; i--) {
    		for(int j = 0; j < num[i]; j++) sum += f[i][j];
    		if(i < cnt && num[i+1] == 4 && num[i] == 9) {
    			sum += orx % ten[i-1] + 1; break;
    		}
    	}
    	return sum;
    }
    
    int main() {
    	ten[0] = 1;
    	for(int i = 1; i < maxn; i++) ten[i] = ten[i-1] * 10;
    	for(int i = 1; i < maxn - 1; i++)
    		for(int j = 0; j <= 9; j++)
    			for(int k = 0; k <= 9; k++) {
    				if(k == 4 && j == 9) f[i+1][k] += ten[i-1];
    				else f[i+1][k] += f[i][j];
    			}
    	
    	int T = read();
    	while(T--) {
    		LL n = read();
    		printf("%lld
    ", sum(n));
    	}
    	
    	return 0;
    }
    

    打这种题最好写一发暴力。。。

  • 相关阅读:
    我和杨兄的不同的Code First简单权限设计
    JavaScript&JQ 004_JS闭包
    省市区三级联动[JSON+Jquery]
    JavaScript 005_JS数组的CRUD
    linq头脑风暴001_聚合函数
    类成员函数指针的特殊之处
    模拟手算,计算组合数C(m,n)
    命令行版扫雷(vc08)
    UNICODE,GBK,UTF8:编码格式的区别
    画高频PCB的心得
  • 原文地址:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/6107251.html
Copyright © 2020-2023  润新知