zoukankan      html  css  js  c++  java
  • 奇妙的算法【6】-WY回文、树、最优化、卷积判断

    1,判断一个十进制正整数的二进制数是否为回文

    package com.cnblogs.mufasa.answer1;
    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            //0,测试专用数据
    //        int[] nums={1,4,7};
    
            //1,数据输入
            Scanner sc=new Scanner(System.in);
            int T=sc.nextInt();
            int[] nums=new int[T];
            for(int i=0;i<T;i++){
                nums[i]=sc.nextInt();
            }
    
            //2,输入数据验证
    //        printOut(nums);//验证正确
    
            //3,正常处理数据
            for(int temp:nums){
                Judge(temp);
            }
        }
    
        //3,单个数据监测是否二进制是回文
        public static void Judge(int temp){
            String str="";
            //3.1,数值转换
            while (temp!=0){
                str=temp%2+str;
                temp=temp/2;
            }
            //3.2,数据判断
            String out="YES";
            int len=str.length();
            for(int i=0;i<len/2;i++){
                if(str.charAt(i)!=str.charAt(len-1-i)){
                    out="NO";
                    break;//提前跳出
                }
            }
            //3.3,结论输出
            System.out.println(out);
        }
    
        //2,测试输入是否正确
        public static void printOut(int[] nums){
            for(int temp:nums){
                System.out.println(temp);
            }
        }
    }
    
    /*
    输入样例:
    3
    1
    4
    7
    输出样例:
    YES
    NO
    YES
     */
    View Code

    2,构建二叉树,找出根节点,然后层次遍历判断

    package com.cnblogs.mufasa.answer2;
    
    import java.util.Scanner;
    import java.util.*;
    
    
    class Node{//节点辅助类
        int value;
        int left;
        int right;
        public Node(int value, int left, int right) {
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }
    
    public class Main {
        public static void main(String[] args){
    
            //1,数据输入
            Scanner in = new Scanner(System.in);
            while (in.hasNext()){
                String line1=in.nextLine();
                int T=Integer.valueOf(line1);
    
                List<Boolean> ret=new ArrayList<>();
                for (int i=0;i<T;i++){
                    String line=in.nextLine();
                    int N=Integer.valueOf(line);
                    Node[] nodes = new Node[N];
    
                    for (int j=0;j<N;j++){
                        String[] nodeData=in.nextLine().split(" ");
                        nodes[j]=new Node(Integer.valueOf(nodeData[0]),
                                Integer.valueOf(nodeData[1]),
                                Integer.valueOf(nodeData[2]));
                    }
                    //2,数据处理
                    ret.add(judge(nodes));
                }
                //3,数据输出
                for (Boolean bool:ret){
                    String s;
                    if (bool){
                        s="YES";
                    }else{
                        s="NO";
                    }
                    System.out.println(s);
                }
            }
        }
    
        //2,数据处理
        private static boolean judge(Node[] nodes){
            int root=findRoot(nodes);
            Stack<Integer> stack=new Stack<>();
            int last=nodes[root].value;
            stack.push(root);
            while (!stack.isEmpty()){
                int sum=0;
                List<Integer> list=new ArrayList<>();
                while (!stack.isEmpty()){
                    int index=stack.pop();
                    int left=nodes[index].left;
                    int right=nodes[index].right;
    
                    if (left!=-1){
                        sum+=nodes[left].value;
                        list.add(left);
                    }
    
                    if (right!=-1){
                        sum+=nodes[right].value;
                        list.add(right);
                    }
                }
    
                if (last>=sum&&list.size()>0){
                    return false;
                }
    
                last=sum;
                for (int index:list){
                    stack.push(index);
                }
            }
            return true;
        }
    
        //寻找根节点
        private static int findRoot(Node[] nodes){
            int[] array=new int[nodes.length];
            for (Node node:nodes){
                if (node.left!=-1){
                    array[node.left]=1;
                }
                if (node.right!=-1){
                    array[node.right]=1;
                }
            }
    
            for (int i=0;i<array.length;i++){
                if (array[i]<1){
                    return i;
                }
            }
            return -1;
        }
    }
    
    
    
    /*
    输入样例:
    2
    8
    2 -1 -1
    1 5 3
    4 -1 6
    2 -1 -1
    3 0 2
    2 4 7
    7 -1 -1
    2 -1 -1
    8
    21 6 -1
    52 4 -1
    80 0 3
    31 7 -1
    21 -1 -1
    59 -1 -1
    50 5 -1
    48 -1 1
    
    输出样例:
    YES
    NO
     */
    View Code

    3,如何在30个单位中插入最多的元素

    package com.cnblogs.mufasa.answer3;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
    
            //1,数据输入
            Scanner sc=new Scanner(System.in);
            int T=sc.nextInt();
            int[][] KM=new int[T][2];
            ArrayList<ArrayList<Integer>> arr=new ArrayList<>(T);
            for(int i=0;i<T;i++){
                KM[i][0]=sc.nextInt();
                KM[i][1]=sc.nextInt();
                ArrayList<Integer> preArr=new ArrayList<Integer>(KM[i][1]);
                arr.add(preArr);
                for(int j=0;j<KM[i][1];j++){
                    preArr.add(sc.nextInt());
                }
            }
    
            //2,输入数据验证
    //        printOut(arr);
    
            //3,数据处理
            for(int i=0;i<T;i++){
                ArrayList<Integer> preArr=arr.get(i);
                dealSum(KM[i][0],KM[i][1],preArr);
            }
    
        }
    
        //3.1,数据处理  全局处理
        public static void dealSum(int k,int m,ArrayList<Integer> preArr){
            int ans=0;
            if(m==0){//3.1,没有固定的天数【正确】
                ans=dealSingle(k,1,30);
            }else if(preArr.get(0)==1){//3.2,有固定天数,第一天为1【正确】
                ans=m;
                for(int i=1;i<preArr.size();i++){
                    ans=ans+dealSingle(k,preArr.get(i-1)+k+1,preArr.get(i)-k-1);
                }
                ans=ans+dealSingle(k,preArr.get(m-1)+k+1,30);
            }else {//3.3,有固定的天数,第一天不为1【正确】
                ans=m;
                ans=ans+dealSingle(k,1,preArr.get(0)-k-1);
                for(int i=1;i<preArr.size();i++){
                    ans=ans+dealSingle(k,preArr.get(i-1)+k+1,preArr.get(i)-k-1);
                }
                ans=ans+dealSingle(k,preArr.get(m-1)+k+1,30);
            }
            System.out.println(ans);
        }
    
        //3.2,数据处理  单个区间处理
        public static int dealSingle(int k,int index0,int index1){//index0可以,index1可以
            if(index1<index0){//非法输入无法进行日期选定
                return 0;
            }else if(index1-index0<k&&index1>=index0){//不够展开,只能在其中任选一天
                return 1;
            }
            int cont=1;//可以展开,可以进行最大化日期选择
            int index=index0;
            while (index<=index1-k-1){
                cont++;
                index+=k+1;
            }
    //        System.out.println("cont:"+cont);
            return cont;
        }
    
        //2,输入数据验证【验证正确】
        public static void printOut(ArrayList<ArrayList<Integer>> arr){
            for(int i=0;i<arr.size();i++){
                ArrayList<Integer> preArr=arr.get(i);
                for(int j=0;j<preArr.size();j++){
                    System.out.print(preArr.get(j)+"-");
                }
                System.out.println();
            }
        }
    }
    /**
     * 1,只有间隔
     */
    
    
    /*
    1
    1 0
    
    1
    5 0
    
    输入样例:
    4
    0 10
    1 2 3 4 5 6 7 8 9 10
    1 15
    1 3 5 7 9 11 13 15 17 19 21 23 25 27 29
    1 7
    5 9 13 17 21 25 29
    1 0
    
    
    输出样例:
    30
    15
    15
    15
    
     */
    View Code

    4,获取最大的合法框图的坐标点【reture无法跳出循环】

    package com.cnblogs.mufasa.myWorkStation;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main4 {
        private static boolean[] flags=new boolean[9];//true表示1,false表示0
        static {
            flags[0]=true;
            flags[2]=true;
            flags[6]=true;
            flags[8]=true;
            for(int i=0;i<9;i++){
                flags[i]=!flags[i];
            }
        }
    
        public static void main(String[] args) {
            ArrayList<int[][]> cacheArr=new ArrayList<>();
            Scanner in=new Scanner(System.in);
            while (in.hasNext()) {
                String line1 = in.nextLine();
                int t = Integer.valueOf(line1);
                for (int i = 0; i < t; i++) {
                    String[] nm = in.nextLine().split(" ");
                    int n = Integer.valueOf(nm[0]);
                    int m = Integer.valueOf(nm[1]);
                    int[][] arr = new int[n][m];
                    for (int j = 0; j < n; j++) {
                        String newLine = in.nextLine();
                        for (int k = 0; k < m; k++) {
                            arr[j][k] = newLine.charAt(k) - '0';
                        }
                    }
                    cacheArr.add(arr);
                    //3,数据验证
    //                for (int[] a : arr) {
    //                    System.out.println(Arrays.toString(a));
    //                }
                }//一组数据输入完成
    
                for(int i=0;i<cacheArr.size();i++){
                    int[][] arr=cacheArr.get(i);
                    int n=arr.length,m=arr[0].length;
                    //2,数据处理
                    dealSum(cacheArr.get(i),n,m);
                }
            }
    
    
        }
    
        //2.1,数据处理函数 sum    全局搜索:由大到小的搜索是否存在
        public static void dealSum(int[][] arr,int N,int M){
            int MIN=(N<M?N:M);
            String strPre="-1 -1 -1 -1";
            String strOut;
            while (MIN>=3){
                if (MIN%3==0){//刚好可以成为一个9宫格
                    strOut=dealSingle(arr,N,M, MIN);
                    if(strOut!=strPre){
                        strPre=strOut;
                        break;
                    }
                }
                MIN--;
            }
            System.out.println(strPre);
        }
    
        //2.2,数据处理 single   固定9宫格的大小,在arr中搜索是否存在
        public static String dealSingle(int[][] arr,int N,int M,int MIN){
            int minLen=MIN/3;
            String outStr="-1 -1 -1 -1";
            loop:for(int i=0;i<N-MIN+1;i++){
                for(int j=0;j<M-MIN+1;j++){
                    boolean sinFlag=dealMin(arr, MIN, minLen, i, j);
    //                System.out.println((i+1)+" "+(j+1)+" "+ (i+MIN)+" "+(j+MIN)+":"+sinFlag);
                    if(sinFlag==true){
    //                    System.out.println("数据处理----------");
                        outStr=((i+1)+" "+(j+1)+" "+ (i+MIN)+" "+(j+MIN));
    //                    System.out.println(outStr);
    //                    System.out.println("数据处理----------");
                        return outStr;
    //                    break loop;
                    }
                }
            }
            return outStr;
        }
    
        //2.3,数据处理 min  固定9宫格,固定index位置,判断是否可以
        public static boolean dealMin(int[][] arr,int MIN,int minLen,int index0,int index1){
            for(int num=0;num<9;num++){
                boolean minFlag=dealSqure(arr,minLen,index0+num/3*minLen,index1+num%3*minLen,flags[num]);
                if(!minFlag){
                    return false;
                }
            }
            return true;
        }
    
        //2.4,数据处理  squre 方块中是否全为1或者0
        public static boolean dealSqure(int[][] arr,int minLen,int index0,int index1,boolean type){
            int mark=(type?1:0);
            for(int i=index0;i<index0+minLen;i++) {
                for (int j = index1; j < index1+minLen; j++) {
                    if(arr[i][j]!=mark){
                        return false;
                    }
                }
            }
            return true;
        }
    }
    
    /*
    输入样例:
    3
    3 3
    111
    000
    111
    6 6
    010010
    111111
    010010
    010010
    111111
    010010
    8 8
    01000001
    11100001
    01001100
    11001100
    00111111
    00111111
    00001100
    11001100
    
    输出样例:
    -1 -1 -1 -1
    1 1 3 3
    3 3 8 8
     */
    View Code
  • 相关阅读:
    CodeForces1422A
    C++
    2020第十一届蓝桥杯第一场 B组 C/C++
    Aizu0118
    POJ1979
    monkey 稳定性测试
    adb shell 杀进程以及端口占用,adbserver服务重启失败
    windows查询端口,杀进程
    apk 测试入门基本操作
    解决 genymotion 安装apk报错 app contains ARM native code and your Genymotion device cannot run ARM instructions
  • 原文地址:https://www.cnblogs.com/Mufasa/p/11489866.html
Copyright © 2011-2022 走看看