2017.12.24
贪心,分治综合习题(2)
1.查找最接近元素
思路:由题可知,n<=100000,m<=10000,如果每一个m都把这个非降序序列扫一遍的话,那么时间复杂的将要到达1010那么多,明显不合题意;所以,只能用二分查找来优化时间复杂度。
核心代码:
int left=1,right=n,mid,bz=0;
while(left<right-1){
bz=0;
mid=(left+right)/2;
if(k==num[mid]){
printf("%d\n",k);
bz=1;
break;
}
else if(k>num[mid])
left=mid;
else if(k<num[mid])
right=mid;
}
if(num[right]-k<k-num[left]&&bz==0){
printf("%d\n",num[right]);
}
else if(num[right]-k>=k-num[left]&&bz==0){
printf("%d\n",num[left]);
}
状态:AC
2.全排列
思路:这个题目的数据范围不大,K<=6,所以可以使用没有任何优化的搜索。题目保证输入的字符串是已经排好序的,所以可以就可以把输入的字符串作为一个有序序列来使用。
核心代码:
void search(int n){
int i,j;
if(n==l){
print();
return;
}
for(i=0;i<l;i++){
if(book[i]==0){
book[i]=1;
answer[n]=letter[i];
search(n+1);
book[i]=0;
}
}
return;
}
状态:AC