【思特奇杯·云上蓝桥-算法集训营】第1周

1、跑步训练

package test;

public class Lqb{
    public static void main(String[] args) {
        double num=10000;
        double k=0;
        while(num!=0) {
            if (num>600) {
                num-=600;
                k++;
                if (num==0) {
                    break;
                }
                num+=300;
                k++;
            }else {
                k*=60;
                k+=num/10;
                break;
            }
        }
        System.out.println((int)k);
    }

}


2、阶乘约数

package test;
//一个数的约数个数等于将其分解成质数乘积后质数的指数加一相乘
//例把这个数先用2、3、5、7、11、13、......等质数的连乘积表示,
//比如24=2*2*2*3=2³*3,再用各个质数的指数加一后再相乘即为此数的约数个数,
//如 (3+1)*(1+1)=4*2=8,即表示24有8个约数。
public class Lqb1 {//【蓝桥杯练习】100的阶乘有多少个约数?
    public static void main(String[] args) {
        int z[]= {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
        int num[]=new int[25];
        int su[]=new int[100];
        long y=1;
        for(int i=0;i<100;i++) {
            su[i]=i+1;
        }
        for(int x=0;x<100;x++) {
            for(int j=0;j<25;j++) {
                if(su[x]%z[j]==0) {
                    num[j]++;
                    su[x]=su[x]/z[j];
                    j--;
                }
            }
        }
        for(int j=0;j<25;j++) {
            y=y*(num[j]+1);
//            System.out.println(num[j]+1);
        }
        System.out.println(y);
    }
}//答案:39001250856960000


3、出栈次序

package test;

//3题    出栈次序
//问题描述
//X星球特别讲究秩序,所有道路都是单行线。
//一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
//路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示。
//X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。
//如果车辆进入检查站和离开的次序可以任意交错。
//那么,该车队再次上路后,可能的次序有多少种?
//为了方便起见,假设检查站可容纳任意数量的汽车。
//显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。
//现在足足有16辆车啊,亲!需要你计算出可能次序的数目。

public class Lqb2 {
    static int y=0;
    public static void main(String[] args){
        Lqb2 l=new Lqb2();
        l.zhang(16,0);
        System.out.println(y);
    }
    
    public void zhang(int x,int i) {
        if(x==0&&i==0) {
            y++;return;
        }
        if(i!=0) {
            zhang(x,i-1);
        }
        if(x!=0) {
            zhang(x-1,i+1);
        }
    }
}//答案:35357670


4、歌德巴赫分解

package test;

public class Lqb3 {
    public static void main(String[] args) {
        Lqb3 l=new Lqb3();
        int s[]=l.zhishu(10000);
        int y=l.min(10000,s);
        System.out.println(y);
    }
    public int[] zhishu(int x){//求2到x之间的质数,数组第0元素为质数个数
        int zs[]=new int[10000];
        zs[1]=2;
        int k=2;
        for(int i=3;i<=x;i++) {
            for(int j=2;j<i;j++) {
                if(i%j==0) {
                    break;
                }
                if(j==i-1) {
                    zs[k]=i;
                    k++;
                }
            }
        }
        zs[0]=k-1;
        return zs;
    }
    public int min(int x,int zs[]){//求x以内的偶数的最大的较小质数差 (4以上的偶数可分解为两个质数和)
        int y=0;
        for(int i=4;i<=x;i=i+2) {
            
            for(int k=1;k<=zs[0];k++) {
                    for(int j=zs[0];j>=k;j--) {            
                        if(zs[j]==i-zs[k]) {
//                            System.out.println("num"+i+"zs"+zs[k]);
                            if(y<zs[k]) {
                                y=zs[k];
                            }
                            j=k-1;k=zs[0]+1;
                        }
                    }
            }
        }
        
        return y;
    }
}答案:173

5、图书排列

package test;

public class Lqb4 {//5题    图书排列
    static int a=0;
    static int b=1;
    static int zz[]= {2,3,4,5,6,7,8,9,10,11};
    public static void main(String[] args) {
        int num[]=new int[12];
        Lqb4 l=new Lqb4();
        l.sx(num,-1);
        System.out.println(a);
    }
    public void sx(int z[],int x) {
        int y[]=new int[12];
        for(int i=1;i<11;i++) {
            y[i]=z[i];    
        }    
            for(int j=1;j<11;j++) {
                if(y[j]==0&&Lqb4.jdz(y[j-1]-zz[x+1])!=1&&Lqb4.jdz(y[j+1]-zz[x+1])!=1) {
                    y[j]=zz[x+1];
                    if(x+1==9) {
                        a++;
                        j=11;
                    }else {
                        sx(y,x+1);y[j]=0;
                    }
                    
                }
            }
        
    }
    public static int jdz(int x) {//求绝对值
        if(x>0) {
            x=x;
        }else {
            x=-x;
        }
        return x;
    }
}//答案:479306


6、猴子分香蕉

package text;
public class Lqb{
    public static void main(String[] args) {
        int ans=0;
        for (int i=3141;i<=10000;i+=5){
            int x=i;
            x-=1;
            if (x%5==0){
                x-=(x)/5;
                if (x%5==2){
                    x-=2;
                    x-=(x)/5;
                    if (x%5==3){
                        x-=3;
                        x-=(x)/5;
                        if (x%5==4){
                            x-=4;
                            x-=(x)/5;
                            if (x%5==0){
                                ans=i;
                                break;
                            }
                        }
                    }

            }

            }
        }
        System.out.println(ans);
    }
}
}答案:3141


7、稍小分数

package test;

public class Lqb5 {
    public static void main(String[] args) {
        int y[]=Lqb5.jyfs(7, 13);
        System.out.println(y[0]+"/"+y[1]);
    }
    public static boolean wwzs(int x,int y) {//判断xy是否互质,x<y
            for(int i=2;i<=x;i++) {
                if(x%i==0&&y%i==0) {
                    return false;
                }
            }
            return true;
    }
    public static int[] jyfs(int x,int y) {//最大既约分数
        int z[]= {1,100};
        float a=1,b=1,c=1;
        for(int i=100;i>0;i--) {
//            System.out.println(z[0]+"|"+z[1]);
            for(int j=100;j>i;j--) {
                a=i;a=a/j;b=x;b=b/y;c=z[0];c=c/z[1];
                if(a<b&&Lqb5.wwzs(x, y)) {
                    if(a>c) {
                        z[0]=i;
                        z[1]=j;
                        
                    }
                }
            }
        }
        return z;
    }
}


8、excel地址

package text;

public class Lqb {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();
        String str="";
        while (num != 0)
        {
            //判断是否整除
            if (num % 26 == 0)
            {
                str = (char)(26 + 64)+str;
                num -= 1;
            }
            else
            {
                str = (char)(num % 26 + 64)+str;
            }
            num /= 26;
        }
        //输出Excel
        System.out.print(str);
    }
}


9、日期问题

package text;

class Lqb{
    public static TreeSet<Integer> set = new TreeSet<Integer>();
    public static List<Integer> list =new ArrayList<Integer>();
    public static void f(String year,String mon,String day) {
        int y = Integer.parseInt(year);
        int m = Integer.parseInt(mon);
        int d = Integer.parseInt(day);
        if(y<=59) {
            y+=2000;
        }else {
            y+=1900;
        }
        if(((y%4==0&&y%100!=0)||y%400==0) && m==2 && d>0 && d<=29) {
            set.add(Integer.parseInt(""+y+mon+day));
        }
        if(y%4!=0 && m==2 && d>0 &&d<=28) {
            set.add(Integer.parseInt(""+y+mon+day));
        }
        if((m==1||m==3||m==5||m==7||m==8||m==10||m==12) && d>0 && d<=31) {
            set.add(Integer.parseInt(""+y+mon+day));
        }
        if((m==4|| m==6|| m==9|| m==11) && d>0&&d<=30) {
            set.add(Integer.parseInt(""+y+mon+day));
        }

    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String[] s =str.split("/");
        f(s[0],s[1],s[2]);
        f(s[2],s[0],s[1]);
        f(s[2],s[1],s[0]);
        list.addAll(set);
        for(int i=0;i<list.size();i++) {
            String ans = ""+list.get(i);
            System.out.println(ans.substring(0, 4)+"-"+ans.substring(4,6)+"-"+ans.substring(6,8));
        }

    }

}



10、整数划分

package test;

public class Lqb8 {//10
    static int a=0;
    public static void main (String[] args) {
        Lqb8.bl(5,1);
        System.out.println(a);
    }
    public static void bl(int x,int y) {
        for(int i=0;i<=(x/y);i++) {
//            System.out.println(i);
                if((x-i*y)==0){
                    a++;
//                    System.out.println(x+" "+i+"*"+y);
                    return;
                }
                x=x-i*y;
                if(y>x) {
                    return;
                }
//                System.out.println(x+" "+y);
                bl(x,y+1);
                x=x+i*y;
        }
    }
}


 


11、一步之遥

package text;


class Lqb{
    public static void main(String[] args) {
        int res = Integer.MAX_VALUE;
        for(int x = 0; x < 100; x++){
            for(int y = 0; y < 100; y++){
                if(x*97 - y*127 == 1){
                    res = Math.min(x+y,res);
                }
            }
        }

        System.out.println(res);
    }
}


12、机器人塔

package test;

public class Lqb10 {//12
    static int g=0;
    public static void main (String[] args) {
        int a[]={1,2};
        int b[]=new int[Lqb10.zs(a)];
//        System.out.println();
        Lqb10.bl(a[0],a[1],b,0);            
        System.out.println("g="+g);
        
    }
    public static int zs(int[] a) {//塔的层数
        int y=0,x,i=1;
        x=a[1]+a[0];
            while(true) {
                x=x-i;
                i++;
                y++;
                if(x==0) {
                    return y;
                }
            }
    
    }
    public static void bl(int x,int y,int[] b,int c) {

        if(x>0) {
            b[c]=1;
            x--;
            if(c<b.length-1) {
            bl(x,y,b,c+1);
            
            }else if(c==b.length-1) {
                for(int i=0;i<b.length;i++) {
                    System.out.print(b[i]+" ");
                }
                System.out.println("1"+"x="+x+"y="+y);
                int[] bb=new int[b.length];int xx=x,yy=y; 
                for(int i=1;i<b.length;i++) {
                    bb[i]=b[i];
                }
                for(int i=1;i<bb.length;i++) {
                    for(int j=0;j<bb.length-i;j++) {
                        if((bb[j]+bb[j+1])%2==0&&xx>0) {
                            xx--;bb[j]=1;
                            if(i==bb.length-1) {
                                g++;System.out.println("g="+g);
                                
                            }
                        }else if((bb[j]+bb[j+1])%2!=0&&yy>0) {
                            yy--;bb[j]=2;
                            if(i==bb.length-1) {
                                g++;System.out.println("g="+g);
                                
                            }
                        }else {
                            j=bb.length;i=bb.length;
                        }
                        
                    }
                    for(int k=0;k<bb.length-i;k++) {System.out.print(bb[i]+" ");}System.out.println("");
                }
            }
            x++;
        }
        if(y>0) {
            b[c]=2;
            y--;
            if(c<b.length-1) {
            bl(x,y,b,c+1);
            }else if(c==b.length-1) {
                for(int i=0;i<b.length;i++) {
                    System.out.print(b[i]+" ");
                }
                System.out.println("2"+"x="+x+"y="+y);
                for(int i=1;i<b.length;i++) {
                    for(int j=0;j<b.length-i;j++) {
                        if((b[j]+b[j+1])%2==0&&x>0) {
                            x--;b[j]=1;
                            if(i==b.length-1) {
                                g++;System.out.println("g="+g);
                                
                            }
                        }else if((b[j]+b[j+1])%2!=0&&y>0) {
                            y--;b[j]=2;
                            if(i==b.length-1) {
                                g++;System.out.println("g="+g);
                                
                            }
                        }else {
                            j=b.length;i=b.length;
                        }
                        
                    }
                    for(int k=0;k<b.length-i;k++) {System.out.print(b[i]+" ");}System.out.println("");
                }
            }
        }
        if(c==b.length-1) {
            return;
        }
    }
    
}


 

13 、七星镇数

package test;

public class Lqb11 {

    public static void main(String[] args) {
        int[] array={1,2,3,4,5,7,8,9,10,12,13};
//        int[] array={1,2,3};
        int[] y=new int[array.length];    
        permute(array,y,0);
        
    }
    //数组重组(全排列)
    public static void permute(int[] array,int[] y,int start){
//        if(start==array.length-1&&text(y)!=null){    //当start(数组指向的数为最后一个时),也就是可交换数到了最后一个
//            System.out.print(text(y));
//            return;
//        }
        if(start==array.length){    
//            for(int i=0;i<y.length;i++) {
//                System.out.print(y[i]+" ");
//            }System.out.println("");
            if(text(y)!=null) {
                System.out.print(text(y));
            }
            return;
        }
            for(int i=0;i<array.length;i++){
                if(y[i]==0) {
                    y[i]=array[start];    
                    permute(array,y,start+1);
                    y[i]=0;
                }
            }
    }
    
    //数组验证
    public static String text(int[] b){
        int[] a=new int[7];
        a[0]=14+b[0]+b[1]+6;
        a[1]=6+b[2]+b[3]+11;
        a[2]=11+b[4]+b[5]+b[6];
        a[3]=b[6]+b[7]+b[0]+b[8];
        a[4]=b[8]+b[1]+b[2]+b[9];
        a[5]=b[10]+b[4]+b[3]+b[9];
        a[6]=b[7]+b[10]+b[5]+14;
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a.length;j++){
                if(a[i]!=a[j]){            //验证错误
                    return null;
                }
            }
        }
        //拼接答案
        String str=b[8]+" "+b[1]+" "+b[2]+" "+b[9];
//        for(int i=0;i<b.length;i++) {
//            System.out.print(b[i]+" ");
//        }System.out.println("");
        return str;
    }
}


//答案:10 3 9 8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值