一、二分查找
1、题目:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
2、代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int middle=0;
int left = 0;
int right = nums.size();
while (left <= right) {
if (nums[middle] < target) {
left = middle + 1;
}
else if (nums[middle] > target) {
right = middle - 1;
}
else if (nums[middle] == target) {
return target;
}
}
return -1;
}
};
二、冶炼金属(蓝桥杯真题)
1、题目:
小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X 。这个炉子有一个称作转换率的属性 V , V 是一个正整数,这意味着消耗 V 个普通金属○恰好可以冶炼出一个特殊金属 X ,当普通金属 O 的数目不足 V 时,无法继续冶炼。
现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B ,这表示本次投入了 A 个普通金属 O ,最终冶炼出了 B 个特殊金属 X 。每条记录都是独立的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。
根据这 N 条冶炼记录,请你推测出转换率 V 的最小值和最大值分
别可能是多少,题目保证评测数据不存在无解的情况。
2、代码:
方法一:
#include <iostream>
#include<algorithm>
using namespace std;
const int N=1e4+10;
int a[N];
int b[N];
int n;
int main()
{
cin>>n;
for(int i=0;i<=n;i++){
cin>>a[i]>>b[i];
}
int minvalue=0;
int maxvalue=1e9;
for(int i=0;i<n;i++){
maxvalue=min(maxvalue,a[i]/b[i]);
minvalue=max(minvalue,a[i]/(b[i]+1)+1);
}
cout<<minvalue<<' '<<maxvalue<<endl;
return 0;
}
方法二:二分法
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+10;
int a[N];
int b[N];
int n;
bool minwide(int v){
for(int i=0;i<n;i++){
if(b[i]<(a[i]/v)){
return false;
}
}
return true;
}
bool maxwide(int v){
for(int i=0;i<n;i++){
if(b[i]>(a[i]/v)){
return false;
}
}
return true;
}
signed main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i]>>b[i];
}
int l1=1;
int r1=1e9;
int middle1=0;
while(l1<r1){
middle1=(l1+r1)/2;
if(minwide(middle1)){
r1=middle1;
}
else{
l1=middle1+1;
}
}
int l2=1;
int r2=1e9;
int middle2=0;
while(l2<r2){
middle2=(r2+l2+1)/2;
if(maxwide(middle2)){
l2=middle2;
}
else{
r2=middle2-1;
}
}
cout<<l1<<' '<<r2<<endl;
return 0;
}
三、分巧克力
1、题目:
儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有 N 块巧克力,其中第 i 块是 HixWi 的方格组成的长方形。为了公平起见,
录
小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。切出的巧克力需要满足:
1.形状是正方形,边长是整数;
习
手
2.大小相同;
例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?
2、代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int h[N];
int w[N];
int n,k;
bool qiaokeli(int l){
int count=0;
for(int i=0;i<n;i++){
count+=((h[i]/l)*(w[i]/l));
}
if(count>=k)
return true;
else
return false;
}
signed main()
{
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>h[i]>>w[i];
}
int l=1;
int r=1e5+5;
int max=0;
while(l<=r){
int middle=(l+r)/2;
if(qiaokeli(middle)){
max=middle;
l=middle+1;
}
else r=middle-1;
}
cout<<max;
return 0;
}