我在哪?(二分)

农夫约翰出门沿着马路散步,但是他现在发现自己可能迷路了!

沿路有一排共 NN 个农场。

不幸的是农场并没有编号,这使得约翰难以分辨他在这条路上所处的位置。

然而,每个农场都沿路设有一个彩色的邮箱,所以约翰希望能够通过查看最近的几个邮箱的颜色来唯一确定他所在的位置。

每个邮箱的颜色用 A..ZA..Z 之间的一个字母来指定,所以沿着道路的 NN 个邮箱的序列可以用一个长为 NN 的由字母 A..ZA..Z 组成的字符串来表示。

某些邮箱可能会有相同的颜色。

约翰想要知道最小的 KK 的值,使得他查看任意连续 KK 个邮箱序列,他都可以唯一确定这一序列在道路上的位置。

例如,假设沿路的邮箱序列为 ABCDABC 。

约翰不能令 K=3K=3,因为如果他看到了 ABC,则沿路有两个这一连续颜色序列可能所在的位置。

最小可行的 KK 的值为 K=4K=4,因为如果他查看任意连续 44 个邮箱,那么可得到的连续颜色序列可以唯一确定他在道路上的位置。

输入格式

输入的第一行包含 NN,第二行包含一个由 NN 个字符组成的字符串,每个字符均在 A..ZA..Z 之内。

输出格式

输出一行,包含一个整数,为可以解决农夫约翰的问题的最小 KK 值。

数据范围

1≤N≤1001≤N≤100

输入样例:

7
ABCDABC

输出样例:

4

 可以找到二段性,二分答案,这里主要看看字符串数组的运用,clear用来清空字符串元素 知识的补充

这里直接给出代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=110;
char arr[N];
string a[N];
int n;
bool check(int mid)//判断是否mid符合题意,符合则找更大的则令l=mid,不然r=mid-1
{
    for(int i=0;i<=n-mid;i++) a[i].clear();//这里要清空每一个字符串数组里的元素
    for(int i=0;i<=n-mid;i++)
    {
        for(int j=i;j<i+mid;j++)
        {
            a[i]+=arr[j];
        }
    }
    for(int i=0;i<n-mid;i++)
    {
        for(int j=i+1;j<=n-mid;j++)
        {
            if(a[i]==a[j]) 
            {
                return false;
            }
        }
    }
    return true;
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++) cin>>arr[i];
    
    int l=0,r=100;
    while(l<r)
    {
        int mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l<<endl;
    return 0;
}

### 回答1: def binary_search(arr, target): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1我可以为你写一段二分查找代码:def 二分查找(arr, target): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ### 回答2: 二分查找(also known as 二分搜索)是一种在有序数组中查找特定元素的算法。它的原理是将数组分成两部分,然后确定目标元素位于哪一部分中,并继续将该部分一分为二,直到找到目标元素或者确定目标元素不存在为止。 下面是一个简单的二分查找的代码示例: ```python def binary_search(arr, target): low = 0 high = len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 # 测试 arr = [1, 3, 5, 7, 9, 11, 13] target = 9 index = binary_search(arr, target) if index != -1: print(f"找到目标元素 {target},在索引位置 {index}。") else: print(f"未找到目标元素 {target}。") ``` 这个二分查找代码中,我们传入一个有序数组 `arr` 和目标元素 `target`,然后使用变量 `low` 和 `high` 分别在数组的最低和最高索引之间进行二分查找。 在每个循环迭代中,我们通过计算 `mid` 来找到数组的中间索引,然后将该索引处的元素与目标元素进行比较。如果它们相等,说明找到了目标元素,返回该索引。如果目标元素比中间元素大,说明目标元素在数组的后半部分,我们将 `low` 更新为 `mid + 1`。如果目标元素比中间元素小,说明目标元素在数组的前半部分,我们将 `high` 更新为 `mid - 1`。 如果循环结束后仍然没有找到目标元素,返回 -1 表示未找到。在示例测试中,我们使用 `[1, 3, 5, 7, 9, 11, 13]` 这个有序数组,在其中查找元素 9,最终返回值为 4,表示目标元素 9 在数组中的索引位置为 4。 希望以上代码能够帮助到您! ### 回答3: 二分查找也被称为折半查找,是一种高效的查找算法。下面是一个用Python编写的二分查找代码示例: ```python def binary_search(arr, target): low = 0 high = len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 # 如果找不到目标元素,返回-1 # 测试代码 arr = [1, 3, 5, 7, 9, 11, 13, 15] target = 7 result = binary_search(arr, target) if result != -1: print("目标元素的索引是:", result) else: print("目标元素不存在.") ``` 这段代码使用了一个循环来不断缩小查找的范围,直到目标元素被找到或者范围缩小至空。在每一次循环中,我们取中间元素的索引并将其与目标元素进行比较。如果目标元素等于中间元素,则返回中间元素的索引;如果目标元素大于中间元素,则说明目标元素在后半部分,将查找范围缩小为后半部分;如果目标元素小于中间元素,则说明目标元素在前半部分,将查找范围缩小为前半部分。如果循环结束时仍未找到目标元素,则返回-1。 在上述代码中,我们将目标元素设为7进行测试,如果找到了目标元素,则打印其索引;否则,打印“目标元素不存在”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值