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

Q:2 3 5 10 12 13 来自Ctrl CV
题目链接

  1. Q

    package praxis;
    
    import org.junit.Test;
    
    public class Week1_1 {
        //per-second
        private final int consume = 600;    //per-min
        private final int recover = 300;    //per-min
        private int energy = 10000; //total
        public int zeroTime(){
            int count = 0;
            while (energy > consume){
                energy -= consume - recover;
                count++;
            }
            return (int)(energy * 60.0 / consume) + count * 2 * 60;
        }
        @Test
        public void testZT(){
            System.out.println(zeroTime()); //3880
        }
    }
    
    
  2. Q

    package praxis;
    //thinkyourself
    public class Week1_2 {
        public static void main(String[] args) {
            // 正约数和 参考每个唯一分解定理
            // 我们把100阶层已知的因子进行拆分
            // 然后对各个质因数量求和
            long ans = 1;
            int[] t = new int[101];
            for (int i = 2; i <= 100; i++) {
                int n = i;
                // 求出这个数字的所含各个质因数的个数
                // 循环进去说明他不是一个合数 我们需要继续拆分
                for (int j = 2; j <= n / j; j++)
                    while (n % j == 0) {
                        t[j]++;
                        n /= j;
                    }
                if (n > 1)
                    t[n]++;
                // 如果n的值没有改变说明本身是一个质数
                // 还有一层含义 当n最后出来但它本身是一个质数 因子
            }
            for (int i = 2; i <= 100; i++) {
                if (t[i] != 0)
                    ans *= (t[i] + 1);
                // 公式
            }
            System.out.println(ans);
        }
    }
    
    
  3. Q

    package praxis;
    
    import java.math.BigInteger;
    
    import org.junit.Test;
    //thinkyourself
    //卡特兰数(Catalan number)
    public class Week1_3 {
    	private final int num = 16;	//车数
    	@Test
    	public void arrangement() {
    		//Catalan数推导式
    		BigInteger res = factorial(num + 1, 2 * num).
    						 	divide(factorial(1, num)).
    						 	divide(BigInteger.valueOf(num + 1));
    		System.out.println(res);
    	}
    	public static BigInteger factorial(int start,int end) {
    		BigInteger res = BigInteger.valueOf(1);
    		for(int i = start;i <= end;i++) {
    			res = res.multiply(BigInteger.valueOf(i));
    		}
    		return res;
    	}
    
    }
    
    
  4. Q

    package praxis;
    
    import java.util.ArrayList;
    
    import org.junit.Test;
    
    public class Week1_4 {
    	private final int num = 10000;
    	ArrayList<Integer> list = new ArrayList<>();	//存较小素数方案
    	@Test
    	public void maxPrime() {
    		//对每个偶数求加数
    		for(int i = 4;i < num;i += 2) {
    			for(int j = 2;j <= i/2;j++) {
    				//从小到大,如果有合适的,记录
    				if(isPrime(j) && isPrime(i - j)) {
    					list.add(j);
    					break;
    				}
    			}
    		}
    		//求较小素数方案中最大的素数
    		int res = 1;
    		for(int e :list) {
    			res = Math.max(res, e);
    		}
    		System.out.println(res);
    	}
    
    	public static boolean isPrime(int num) {
    	    if (num <= 3) {
    	        return num > 1;
    	    }
    	    if (num % 6 != 1 && num % 6 != 5) {
    	        return false;
    	    }
    	    int sqrt = (int) Math.sqrt(num);
    	    for (int i = 5; i <= sqrt; i += 6) {
    	        if (num % i == 0 || num % (i + 2) == 0) {
    	            return false;
    	        }
    	    }
    	    return true;
    	}
    }
    
    
  5. Q

    package praxis;
    
    //thinkyourself
    public class Week1_5 {
    	public static void main(String[] args) {
            int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            fullSort(arr, 0, arr.length - 1);
            System.out.println(res);
        }
    
        static int res = 0;
    
        static void fullSort(int[] arr, int start, int end) {
            // 递归终止条件
            if (start == end) {
                // 求出了全排列的一种情况,然后检查是否满足条件
                if (check(arr))
                    res++;
                return;
            }
            for (int i = start; i <= end; i++) {
                swap(arr, start, i);
                fullSort(arr, start + 1, end);
                swap(arr, start, i);
            }
        }
    
        private static void swap(int[] arr, int i, int j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    
        static boolean check(int[] arr) {
            for (int i = 1; i < arr.length; i++) {
                if (Math.abs(arr[i] - arr[i - 1]) == 1)
                    return false;
            }
            return true;
        }
    }
    
    
  6. Q

    package praxis;
    
    import org.junit.Test;
    
    public class Week1_6 {
    //x%5 == 1 ==> (x-1)*4/5 = y
    //y%5 == 2 ==> (y-2)*4/5 = z
    //z%5 == 3 ==> (z-3)*4/5 = w
    //w%5 == 4 ==> (w-4)*4/5 = n
    //n%5 == 0
    	@Test
    	public void findOriginal() {
    		for(int i = 1;i < Integer.MAX_VALUE;i++) {
    			int x = i;
    			if(x%5 == 1) {
    				int y = hideFun(i - 1);
    				if(y != -1 && y%5 == 2) {
    					int z = hideFun(y - 2);
    					if(z != -1 && z%5 == 3) {
    						int w = hideFun(z - 3);
    						if(w != -1 && w%5 == 4) {
    							int n = hideFun(w - 4);
    							if(n != -1) {
    								System.out.println(i);
    								break;
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    	//求下次看到的数量
    	public int hideFun(int num) {
    		int ret = -1;
    		double temp = num*0.8;
    		return num*4/5 == Math.round(temp)?(int)Math.round(temp):ret;
    	}
    }
    
    
  7. Q

    package praxis;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.junit.Test;
    
    public class Week1_7 {
    	private HashMap<Integer,Integer> map = new HashMap<>();
        public static int[] produce(){
            int[] fraction = new int[2];
            fraction[0] = (int)(Math.random() * 101);
            fraction[1] = 100;
            do {
                fraction[1] = (int)(Math.random() * 101);
            }while(fraction[1] < fraction[0]);
            return fraction;
        }
        public int[] slight(int up,int down) {
            boolean tag = false;
            //削分子
            for(int i = up;i > 0;i--) {
                if(isPrime(i)) {
                    //加分母
                    if(!tag) {
                        for(int j = down;j < 101;j++) {
                            if(isPrime(j)) {
                                map.put(i, j);
                                tag = true;
                                break;
                            }
                        }
                    }
                    //减分母(此步易漏)
                    for(int j = down;j > 0;j--) {
                        if(isPrime(j) && i*1.0/j < up*1.0/down) {
                            map.put(i, j);
                        }
                    }
    
                }
            }
            int[] res = {0,1};
            for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
                if(entry.getKey()*1.0/entry.getValue() > res[0]*1.0/res[1]) {
                    res[0] = entry.getKey();
                    res[1] = entry.getValue();
                }
            }
            return res;
        }
        @Test
        public void test() {
            for(int i = 1;i < 10;i++) {
                int[] pre = produce();
                int[] res = slight(pre[0], pre[1]);
    			System.out.println(pre[0]+ "/" + pre[1] + "\t==> " + res[0] + "/" + res[1]);
            }
        }
        public static boolean isPrime(int num) {
            if (num <= 3) {
                return num > 1;
            }
            if (num % 6 != 1 && num % 6 != 5) {
                return false;
            }
            int sqrt = (int) Math.sqrt(num);
            for (int i = 5; i <= sqrt; i += 6) {
                if (num % i == 0 || num % (i + 2) == 0) {
                    return false;
                }
            }
            return true;
        }
    }
    
  8. Q

    package praxis;
    
    import org.junit.Test;
    
    public class Week1_8 {
    	private static int COLUMN = 26;
    	public int getOrder(int num) {
    		// 25 -> 1 ; 27 -> 2
    		for(int i = 1;;i++) {
    			if(Math.pow(COLUMN, i) >= num) {
    				return i;
    			}
    		}
    	}
    	public void excelAddress(int input) {
    		int order = getOrder(input);
    		StringBuilder stringBuilder = new StringBuilder();
    		while(--order >= 0) {
    			for(int i = 1;i <= 26;i++) {
    				int temp = (int)Math.pow(COLUMN, order) * i;
    				int temp2 = (int)(1.0 * COLUMN * ((1 - Math.pow(COLUMN, order))/(1 - COLUMN)));
    				if((temp + order) >= input || (temp + temp2 >= input)){
    					input -= Math.pow(COLUMN, order) * i;
    					stringBuilder.append((char)('A' + i - 1));
    					break;
    				}
    			}
    		}
    		System.out.println(stringBuilder.toString());
    	}
    	@Test
    	public void test() {
    		excelAddress(2054);
    		System.out.println("sdf");
    	}
    }
    
    
  9. Q

    package praxis;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    
    import org.junit.Test;
    
    public class Week1_9 {
    	private static SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd");
    	private static Date leftBoundary;
    	private static Date rightBoundary;
    	{
    		try{
    			leftBoundary = form.parse("1960-1-1");
    			rightBoundary = form.parse("2059-12-31");
    		}catch (Exception e) {}
    	}
    	public String[] format(String input) {
    		String[] strings = new String[6];
    		StringBuilder bld = new StringBuilder();
    		strings[0] = bld.append(19).append(input.substring(0,2)).append("-").
    						 append(input.substring(3,5)).append("-").append(input.substring(6,8)).toString();
    		bld.delete(0, bld.length());
    		strings[1] = bld.append(20).append(input.substring(0,2)).append("-").
    						 append(input.substring(3,5)).append("-").append(input.substring(6,8)).toString();
    		bld.delete(0, bld.length());
    		strings[2] = bld.append(19).append(input.substring(6,8)).append("-").
    						 append(input.substring(0,2)).append("-").append(input.substring(3,5)).toString();
    		bld.delete(0, bld.length());
    		strings[3] = bld.append(20).append(input.substring(6,8)).append("-").
    						 append(input.substring(0,2)).append("-").append(input.substring(3,5)).toString();
    		bld.delete(0, bld.length());
    		strings[4] = bld.append(19).append(input.substring(6,8)).append("-").
    						 append(input.substring(3,5)).append("-").append(input.substring(0,2)).toString();
    		bld.delete(0, bld.length());
    		strings[5] = bld.append(20).append(input.substring(6,8)).append("-").
    						 append(input.substring(3,5)).append("-").append(input.substring(0,2)).toString();
    		bld.delete(0, bld.length());
    		return strings;
    	}
    	@Test
    	public void test() {
    		String input = "02/03/04";
    		conversion(input);
    	}
    	public void conversion(String input) {
    		ArrayList<Date> list = new ArrayList<Date>();
    		for(String str : format(input)) {
    			if(islawful(str)) {
    				try {
    					list.add(form.parse(str));
    				}catch (Exception e) {}
    			}
    		}
    		list.sort((Date a,Date b) -> a.compareTo(b));
    		for(Date date : list) {
    			System.out.println(form.format(date));
    		}
    	}
    	public static boolean islawful (String str) {
    		Date date;	
    		try {
    			date = form.parse(str);
    		}
    		catch (Exception e) {return false;}
    		return (date.before(leftBoundary) || date.after(rightBoundary)) ?
    				false : true;
    	}
    
    }
    
    
  10. Q

    package praxis;
    
    import org.junit.Test;
    
    //thinkYourself
    public class Week1_10 {
    	public int div(int n,int m) {
    		if(n == 1||m == 1)
    			return 1;
    		else if(n < m)
    			return div(n,n);
    		else if(n == m)
    			return 1+div(n,n-1);
    		else
    			return div(n,m-1) + div(n-m,m);
    	}
    	public int divideMethod(int num) {
    		return div(num, num);
    	}
    	@Test
    	public void test() {
    		System.out.println(divideMethod(5));
    	}
    }
    
    
  11. Q

    package praxis;
    
    import org.junit.Test;
    
    public class Week1_11 {
    	@Test
    	public void getOptions() {
    		int forward = 97;
    		int back = 127;
    		int step = 1;
    		for(int i = 1;;i++) {
    			if(((back + forward) * i + step) % forward == 0) {
    				System.out.println(((back + forward) * i + step) / forward);
    				break;
    			}
    		}
    	}
    }
    
    
  12. Q

    package praxis;
    import java.util.Scanner;
    //thinkyourself
    public class Week1_12 {
        public static int m, n;
        public static int[][] value; 
        public static int len, count = 0;
    
        public void check() {
            for(int i = len - 2, t = 1;i >= 0;i--, t++)
                for(int j = 0;j < len - t;j++) {
                    if(value[i + 1][j] == value[i + 1][j + 1])
                        value[i][j] = 1;
                    else
                        value[i][j] = 2;
                }
            int sumA = 0, sumB = 0;
            for(int i = 0, t = len - 1;i < len;i++, t--)
                for(int j = 0;j < len - t;j++) {
                    if(value[i][j] == 1)
                        sumA++;
                    else if(value[i][j] == 2)
                        sumB++;
                }
            if(sumA == m && sumB == n)
                count++;
        }
    
        public void dfs(int step) {
            if(step == len) {
                check();
                return;
            } else {
                for(int i = 1;i <= 2;i++) {
                    value[len - 1][step] = i; 
                    dfs(step + 1);
                }
            }
        }
    
    
        public static void main(String[] args) {
        	Week1_12 test = new Week1_12();
            Scanner in = new Scanner(System.in);
    //        m = in.nextInt();
    //        n = in.nextInt();
            m = 1;
            n = 2;
            for(int i = 1;i < 100;i++) {   
                int a = (i + 1) * i / 2;
                if(a == m + n) {
                    len = i;
                    value = new int[a][a];
                    break;
                }
            }
            test.dfs(0);
            System.out.println(count);
        }
    }
    
    
  13. Q

    package praxis;
    
    import java.util.HashSet;
    
    import org.junit.Test;
    //thinkyourself
    public class Week1_13 {
        public static int sum = 0;
        
        public void swap(int[] A, int i, int j) {
            int temp = A[i];
            A[i] = A[j];
            A[j] = temp;
        }
        
        public void dfs(int[] A, int step) {
            if(step == A.length) {
                int[] count = new int[7];
                count[0] = A[0] + A[1] + A[2] + A[3];
                count[1] = A[0] + A[4] + A[6] + A[9];
                count[2] = A[1] + A[4] + 6 + 14;
                count[3] = A[2] + A[5] + 6 + 11;
                count[4] = A[6] + A[8] + A[10] + 14;
                count[5] = A[7] + A[8] + A[9] + 11;
                count[6] = A[3] + A[5] + A[7] + A[10];
                HashSet<Integer> set = new HashSet<Integer>();
                for(int i = 0;i < 7;i++)
                    set.add(count[i]);
                if(set.size() == 1) {
                    for(int i = 0;i < A.length;i++)
                        System.out.print(A[i]+" ");
                    System.out.println();
                }
                sum++;
                return;
            } else {
                for(int i = step;i < A.length;i++) {
                    swap(A, i, step);
                    dfs(A, step + 1);
                    swap(A, i, step);
                }
            }
        }
        @Test
        public void heptagon()  {
            int[] A = {1,2,3,4,5,7,8,9,10,12,13}; //10 3 9 8 
            dfs(A, 0);
            System.out.println(sum);
        }
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值