1.内容##
主题是程序正确性验证,结果写了很多二分搜索
2.习题##
2.二分搜索改1###
写一个二分搜索,其相对于一般的二分搜索可以返回重复元素在数组中第一次出现的位置。
#include <iostream>
using namespace std;
int bs(int *arr, int begin, int end, int target)
{
int mid;
int last=-1;//指向遇到的最后一个符合条件的值
while (begin <= end)
{
mid= (begin+end)/2;
if(arr[mid] ==target)
{
last=mid;// 记录下来
end=mid-1;// 因为要找的是第一个,所以抛弃后面的,往前面找
}
else if(arr[mid] < target)
{
begin=mid+1;
}
else
{
end=mid-1;
}
}
if(last!=-1) return last;
else return -1;
}
int main()
{
int arr[21]={1,2,3,3,3,4,4,4,5,6,7,7,7,8,8,8,8,9,9,10,11};
cout<<bs(arr, 0, 20, 7)<<endl;
return 0;
}
3.二分搜索改2###
用递归写一个二分搜索
#include <iostream>
using namespace std;
int bs(int *arr, int begin, int end, int target)
{
if(begin>end) return -1;
int mid;
while (begin <= end)
{
mid= (begin+end)/2;
if(arr[mid] ==target)
{
return mid;
}
else if(arr[mid] < target)
{
return bs(arr, mid+1, end, target);
}
else
{
return bs(arr, begin, mid-1, target);
}
}
return -1;
}
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
cout<<bs(arr, 0, 9, 7)<<endl;
return 0;
}
6.咖啡罐问题###
w(白豆子), b(黑豆子),罐内由若干白豆子和黑豆子,以及额外的黑豆子
1.if w w => -w -w +b
2.if b b => -b -b +b
3.if w b => -b
容易看出,三种情况,都会扔掉一个豆子,所以罐子的豆子一定是扔的完的。观察发现,每次只会扔掉偶数个白豆子,所以,若白豆子是一开始偶数,则最后剩下的那一个豆子一定是黑的;若报豆子一开始是奇数,则最后剩下的那个豆子是白的。