当前位置: 代码迷 >> 综合 >> 蓝桥杯31天冲刺 Day23
  详细解决方案

蓝桥杯31天冲刺 Day23

热度:52   发布时间:2023-11-27 09:33:59.0

蓝桥杯31天冲刺 Day23

  • 寻找三位数
  • 打包
  • 约数个数

寻找三位数

链接: 寻找三位数.
在这里插入图片描述
DFS 全排列就好了

public class 寻找三位数 {
    public static int[] nums = {
    1,2,3,4,5,6,7,8,9};public static void main(String[] args) {
    // TODO Auto-generated method stubDFS(0);}public static void DFS(int start) {
    if(start == 8) {
    int a = nums[0] * 100 + nums[1] * 10 + nums[2];int b = nums[3] * 100 + nums[4] * 10 + nums[5];int c = nums[6] * 100 + nums[7] * 10 + nums[8];//System.out.println(a+" "+b+" "+c);if(b == 2*a && c == 3*a)System.out.println(a+" "+b+" "+c);return;}for(int i = start;i<9;i++) {
    swap(i,start);DFS(start+1);swap(i,start);}}public static void swap(int i,int j) {
    int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}

打包

链接: 打包.
在这里插入图片描述
这题我们使用二分思想来解决

import java.util.Scanner;public class Main {
    public static int[] w;public static int n,m;public static boolean check(int mid) {
    int count=1;int sum=w[0];for(int i=1;i<n;i++) {
    if(sum+w[i]<=mid) {
    sum+=w[i];}else {
    count++;sum=w[i];}}if(count<=m) {
    return true;}return false;}public static void main(String[] args) {
    // TODO Auto-generated method stubScanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();w = new int[n];int r=0;int l=Integer.MIN_VALUE;for(int i=0;i<n;i++) {
    w[i] = sc.nextInt();r+=w[i];l = Math.max(w[i], l);}int mid=0,res=0;while(l<=r) {
    mid = (r+l)/2;if(check(mid)) {
    res = mid;r=mid-1;}else {
    l=mid+1;}}System.out.println(res);}}

约数个数

链接: 约数个数.
在这里插入图片描述
这题不用完全模拟枚举约数的整个过程。仔细推导一下,我们可以看出来所有约数的个数就是从1到n对与n相除的结果,再每次取模就好了

完整代码:

import java.util.*;
public class 约数个数 {
    /*** @param args*/public static void main(String[] args) {
    // TODO Auto-generated method stubScanner sc  = new Scanner(System.in);int x = sc.nextInt();int sum = 0;for(int i=1;i<=x;i++){
    sum+=(x/i) % 1000000007;}System.out.println(sum);}}