二分思想很简单,但是不知道做题怎么样,一道简单的题
这道题如果不用二分而是枚举的话,会超时,因为时间是1s,所以先打表把所有special number ,然后二分查找第一个比他大的。
<span style="font-size:14px;">#include <iostream>
#include <cstring>
using namespace std;
int arr[10000000];
bool check(int p)
{
int t;
bool jude[10],flag=true;
memset(jude,false,sizeof(jude));
while(p!=0)
{
t=p%10;
p=p/10;
if(jude[t]==true)
{
flag=false;
break;
}
jude[t]=true;
}
return flag;
}
int main()
{
int i,total=0,n;
cin>>n;
for(i=1;i<=10000000;i++)
{
if(check(i)==true)
{
arr[total++]=i;
}
}
int l=0;int r=total-1,mid,res=0;///把左右边界初始化
while(l<=r) //模版
{
mid=(l+r)/2;//二分
if(arr[mid]<n)
{
l=mid+1;
res=mid;
}
else
{
r=mid-1;
}
}
res++;//因为从0开始的
cout<<res;
}
</span>
Nettle最近在玩《艦これ》,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位)。去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船。每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高。
Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的。如果是重复的,那么这艘船在Nettle所有的船里面稀有值排多少位。
-
10 5180 2970 663 5480 4192 4949 1 1387 4428 5180 2761
int n, k;
int a[1000005];
//模版
int b_search(int x) {
int L = 0, R = n - 1;
while(L <= R) {
int mid = (L + R) >> 1;
if(a[mid] == x) return mid + 1;
else if(a[mid] > x) R = mid - 1;
else if(a[mid] < x) L = mid + 1;
}
return -1;
}
int main() {
while(scanf("%d %d", &n, &k) != EOF) {
for(int i = 0; i < n; i ++) {
scanf("%d", &a[i]);
}
sort(a, a + n);
int ans = b_search(k);
printf("%d\n", ans);
}
return 0;
}