蓝桥杯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);}}