生活随笔
收集整理的這篇文章主要介紹了
二分查找相关的题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 問題 A: 找x
- 問題 B: 打印極值點下標
- 問題 C: 查找
問題 A: 找x
http://codeup.cn/problem.php?cid=100000585&pid=0
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std
;
int solve(int left
,int right
,int x
,int a
[])
{int mid
;while(left
<=right
){mid
=(left
+right
)/2;if(a
[mid
]==x
)return mid
;if(a
[mid
]>x
){right
=mid
-1;}else{left
=mid
+1;}}return -1;
}
int main(void)
{int n
;while(cin
>>n
){int a
[205];for(int i
=0;i
<n
;i
++){cin
>>a
[i
];}sort(a
,a
+n
);int x
;cin
>>x
;printf("%d\n",solve(0,n
-1,x
,a
));}return 0;
}
問題 B: 打印極值點下標
http://codeup.cn/problem.php?cid=100000585&pid=1
思路:
先看第一個和第二個相不相等,不相等就輸出下標
看中間部分挨個遍歷,如果一個數的左邊一個數和右邊一個數都不這個數大或小,就輸出當前的下標。
然后看最后一個和最后第二個相不相等,不相等就輸出下標。
#include<iostream>
#include<cstdio>
using namespace std
;
int main(void)
{int n
;int N
;while( scanf("%d",&n
) != EOF){for(int i
=0;i
<n
;i
++){cin
>>N
;int a
[85]={0};for(int i
=0;i
<N
;i
++)scanf("%d",&a
[i
]);if(a
[0]!=a
[1])printf("0 ");for(int i
=1;i
<N
-1;i
++){if( ( a
[i
]>a
[i
-1] && a
[i
]>a
[i
+1] ) || (a
[i
]<a
[i
-1] && a
[i
+1]>a
[i
] ) ){printf("%d ",i
);}}if(a
[N
-1]!=a
[N
-2])printf("%d\n",N
-1);}}return 0;
}
問題 C: 查找
http://codeup.cn/problem.php?cid=100000585&pid=2
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std
;
bool flag(int a
[],int left
,int right
,int number
)
{int mid
;while(left
<=right
){mid
=(left
+right
)/2;if(a
[mid
]==number
)return true;if(a
[mid
]>number
){right
=mid
-1;}else{left
=mid
+1;}}return false;
}
int main(void)
{int n
,m
;int i
;int a
[105];while(cin
>>n
){for(i
=0;i
<n
;i
++)cin
>>a
[i
];sort(a
,a
+n
);cin
>>m
;for(i
=0;i
<m
;i
++){int number
;cin
>>number
;if(flag(a
,0,n
-1,number
))printf("YES\n");elseprintf("NO\n");}}return 0;
}
總結
以上是生活随笔為你收集整理的二分查找相关的题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。