535B:Tavas and SaDDas

题目链接:http://codeforces.com/contest/535/problem/B
对输入的num,求出从1-num有多少个数只包含4或7.
比如:4、7、44、47、444、447
你输入的数字是500,则输出是7。
存暴力的求解不行,solve就是纯暴力的,对1-num里面的数字,判断每个数字是否只含有4或7,最后一个时间超时。
solve2根据队列,找规律,只要不满足条件就一次性入队列两个数,这里可能会出现这个问题,当num比较大的时候,结束时候,队列中还存在很多的元素。

 temp=fornt*10+4; pq.add(temp); temp=fornt*10+7; pq.add(temp);

这个规律很重要,输入的数,还在有序的。

import java.util.PriorityQueue;
import java.util.Scanner;


public class B535 {
    void solve2(){
        Scanner in=new Scanner(System.in);
        long num=in.nextInt();

        PriorityQueue pq=new PriorityQueue();
        pq.add((long)4);
        pq.add((long)7);
        int n=0;
        while(!pq.isEmpty()){
            Long fornt=(Long) pq.remove();
            Long temp=(long) 0;
            if(fornt<=num){
                temp=fornt*10+4;
                pq.add(temp);
                temp=fornt*10+7;
                pq.add(temp);
                n++;

            }
        }
        System.out.println(n);
    }
    void solve(){
        Scanner in=new Scanner(System.in);
        int num=in.nextInt();
        int n=0;

        for(int i=3;i<=num;i++){
            if(Judge(i)==true){
                n+=1;
            }
        }
        System.out.println(n);

        }
    //判断各位是不是4 或 7
    static boolean Judge(int num){
        int ge=0;
        while(num!=0){
            ge=num%10;
            if(ge!=4 && ge!=7){
                return false;
            }
            num=num/10;
        }
        return true;
    }
    public static void main(String[] args) {
        new B535().solve2();

    }

}

你可能感兴趣的:(java,CF,CF-java)