二分
分巧克力
java
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n=scan.nextInt();
int k=scan.nextInt();//小朋友
int[][] area=new int[n][2];
for(int i=0;i<n;i++){
int h=scan.nextInt();
int w=scan.nextInt();
area[i][0]=h;
area[i][1]=w;
}
System.out.println(function(area,k));
scan.close();
}
static int function(int[][]area,int k){
int l=1;//巧克力边长最小为l
int r=(int) 1e5;//边长最大为r
int mid=0;
while(l<r) {
mid=(l+r+1)/2;
if(check(area,mid)>=k) {//取满足条件的最大边长,满足条件时动l,所以循环条件时>=
l=mid;
}else {
r=mid-1;
}
}
return l;
}
//判断边长为mid的巧克力,可以分成几块
private static int check(int[][]area,int mid) {
// TODO Auto-generated method stub
int res=0;
for(int i=0;i<area.length;i++) {
res+=(area[i][0]/mid)*(area[i][1]/mid);
}
return res;
}
}
求阶乘
java
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
long k=scan.nextLong();
long l=0;//最小是0!
long r=(long) 1e19;//最大是1e19 !
while(l<r){//
long mid=(l+r)>>1;
if(check(mid)>=k){//找满足条件的最小N,满足条件时动r,所以执行r=mid,所以条件是>=
r=mid;
}else{
l=mid+1;
}
}
if(check(r)==k){
System.out.println(r);
}else{
System.out.println(-1);
}
scan.close();
}
//检查一下数字num的阶乘末尾的0的个数
static long check(long num){
long res=0;
while(num!=0){
res+=num/5;
num/=5;
}
return res;
}
}
计算方程
java
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码..
int t=scan.nextInt();
for(int i=0;i<t;i++){
int k=scan.nextInt();
int m=scan.nextInt();
System.out.println(func(k,m));
}
scan.close();
}
static int func(int k,int m){
int l=1,r=(int)1e8,mid;
while(l<r){
mid=(l+r)/2;
if(check(mid,k,m)){
r=mid;
}else {
l=mid+1;
}
}
return l;
}
static boolean check(int x,int k,int m){
return Math.sqrt(x)+(int)(Math.log(x)/Math.log(k))>m;
}
}