zoukankan      html  css  js  c++  java
  • HPU省赛训练(二)

    HPU省赛训练(二)

    H - Mountain Number

    Mountain Number

    题目描述

    One integer number x is called “Mountain Number” if:
    (1) x>0 and x is an integer;
    (2) Assume x=a[0]a[1]…a[len-2]a[len-1](0≤a[i]≤9, a[0] is positive). Any a[2i+1] is larger or equal to a[2i] and a[2i+2](if exists).
    For example, 111, 132, 893, 7 are “Mountain Number” while 123, 10, 76889 are not “Mountain Number”.
    Now you are given L and R, how many “Mountain Number” can be found between L and R (inclusive) ?

    Input

    The first line of the input contains an integer T (T≤100), indicating the number of test cases.
    Then T cases, for any case, only two integers L and R (1≤L≤R≤1,000,000,000).

    Output

    For each test case, output the number of “Mountain Number” between L and R in a single line.

    思路

    应该是数位dp以前学习的不扎实,这次好好的补一下, 三维dp,dp[i][j][k] 代表这个数的第i位前面一位为j的时候k代表当前为是否为偶数位,如果k=1代表是偶数位,否则不是,

    code

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int t ; 
    int v[20] ,cnt ;
    int dp[20][20][2] ;
    
    int dfs(int pos ,int per ,bool flag ,int odd) {
    	if ( cnt + 1 == pos ) return 1 ; 
    	if ( !flag && dp[pos][per][odd] ) return dp[pos][per][odd] ;
    	int r = flag ? v[pos] : 9 ;
    	int ret = 0 ;
    	for (int i = 0 ; i <= r ; i ++ ) {
    		if ( odd && i >= per ) ret += dfs(pos + 1 ,i ,flag&&(i == v[pos]) ,odd^1) ;
    		else if ( !odd && i <= per ) ret += dfs(pos + 1 ,i ,flag&&(i == v[pos] ),odd^1 ) ;  
    	}
    	if ( !flag ) dp[pos][per][odd] = ret ;
    	return ret ;
    }
    
    int slove(int x) {
    	cnt = 0 ;
    	while( x ) {
    		v[++cnt] = x % 10 ;
    		x /= 10 ;
    	}
    	if ( cnt == 1 ) return v[1] ;
    	reverse(v + 1 ,v + cnt + 1 ) ;
    	memset(dp ,0 ,sizeof(dp)) ;
    	return dfs(1 ,9 ,true ,0 ) ;
    }
    
    int main() {
    	cin >> t ;
    	while ( t -- ) {
    		int l ,r ;
    		scanf("%d %d",&l ,&r ) ;
    		printf("%d
    ",slove(r) - slove(l-1)) ;
    	}
    	return 0;
    }
    

    D - Digits Count

    题目描述

    Given N integers A={A[0],A[1],…,A[N-1]}. Here we have some operations:
    Operation 1: AND opn L R
    Here opn, L and R are integers.
    For L≤i≤R, we do A[i]=A[i] AND opn (here “AND” is bitwise operation).
    Operation 2: OR opn L R
    Here opn, L and R are integers.
    For L≤i≤R, we do A[i]=A[i] OR opn (here “OR” is bitwise operation).
    Operation 3: XOR opn L R
    Here opn, L and R are integers.
    For L≤i≤R, we do A[i]=A[i] XOR opn (here “XOR” is bitwise operation).
    Operation 4: SUM L R
    We want to know the result of A[L]+A[L+1]+…+A[R].
    Now can you solve this easy problem?

    input

    The first line of the input contains an integer T, indicating the number of test cases. (T≤100)
    Then T cases, for any case, the first line has two integers n and m (1≤n≤1,000,000, 1≤m≤100,000), indicating the number of elements in A and the number of operations.
    Then one line follows n integers A[0], A[1], …, A[n-1] (0≤A[i]<16,0≤i<n).
    Then m lines, each line must be one of the 4 operations above. (0≤opn≤15)

    output

    For each test case and for each “SUM” operation, please output the result with a single line.

    待更来日再补

  • 相关阅读:
    gcc -I -L -l区别
    如何在LINUX中开机、登陆、退出、定时、定期自动运行程序
    4B/5B编码原理
    powerpc平台移植zebra或quagga-0.99.23
    ubuntu 命令配置ip 网关 dns
    ubuntu新机安装工具
    svn add --no-ignore
    SSL handshake failed: SSL error: Key usage violation in certificate has been detected.
    netif_start_queue/netif_wake_queue/netif_stop_queue
    Linux系统中提示/usr/bin/ld: cannot find -lxxx错误的通用解决方法
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11745917.html
Copyright © 2011-2022 走看看