寻找三位数
链接: 寻找三位数.
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 stub
DFS(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 stub
Scanner 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 stub
Scanner 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);
}
}