考研算法
前言
本系列文章涉及的算法内容,针对的是哈尔滨工业大学854科目。在本文中通过具体的算法题进行讲解相应算法。
一、二分算法
算法题目:可可吃香蕉
Koko喜欢吃香蕉。有n堆香蕉,第i堆有成堆的[i]香蕉。警卫已经离开,将在h小时后回来。
Koko可以决定她每小时吃香蕉的速度为k。每小时,她选择一些香蕉堆,并从该堆中吃k个香蕉。
如果这堆香蕉的数量少于k,她就把所有的香蕉都吃了,而且在这一小时内不会再吃任何香蕉。
Koko喜欢慢慢地吃,但还是想在守卫回来之前吃完所有的香蕉。
返回最小整数k,使她能在h小时内吃完所有香蕉。
解题思路:
每个小时吃的数量k,最小为1,最大为piles数组中的最大值,最大值记为max。
设定区间[1 - max]
进行二分,不断更新区间的左边界,最后返回左边界。
算法代码:
public class Solution {
public static boolean isValid(int mid, int[] piles, int h){
int hours = 0;
for(int pile : piles){
int time = pile / mid;
hours += time;
if(pile % mid != 0){
++hours;
}
}
if(hours <= h){
return true;
}
return false;
}
public static int minEatingSpeed(int[] piles, int h){
int l = 1;
int r = Integer.MAX_VALUE;
for(int num : piles){
r = r > num ? r : num;
}
while(l < r){
int mid = l + ((r - l) >> 1);
if(isValid(mid, piles, h)){
r = mid;
}
else{
l = mid + 1;
}
}
return l;
}
}
一、数学算法
算法题目:剧院广场
A. Theatre Square
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Theatre Square in the capital city of Berland has a rectangular shape with the size n × m meters. On the occasion of the city's anniversary, a decision was taken to pave the Square with square granite flagstones. Each flagstone is of the size a × a.
What is the least number of flagstones needed to pave the Square? It's allowed to cover the surface larger than the Theatre Square, but the Square has to be covered. It's not allowed to break the flagstones. The sides of flagstones should be parallel to the sides of the Square.
Input
The input contains three positive integer numbers in the first line: n, m and a (1 ≤ n, m, a ≤ 109).
Output
Write the needed number of flagstones.
Examples
input
6 6 4
output
4
首都贝兰的剧院广场呈长方形,尺寸为n×m米。在城市周年纪念日之际,人们决定用方形花岗岩旗杆石铺设广场。每块旗杆石的尺寸为a×a。
铺设广场所需的最少旗杆石数量是多少?允许覆盖比剧院广场更大的表面,但广场必须被覆盖。不允许打破旗杆石。旗杆石的边应该与广场的边平行。
解题思路:
从长度和宽度入手,判断长度所需最少几块,这里块数记作w,需满足n $\lt w \cdot a$,同理m $\lt w \cdot a$
算法代码:
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
long n, m, a;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
a = sc.nextInt();
long ans1 = n / a;
if(n % a != 0){
++ans1;
}
long ans2 = m / a;
if(m % a != 0){
++ans2;
}
long res = ans1 * ans2;
System.out.println(res);
}
}