题A:Where is the Marble?
链接:https://odzkskevi.qnssl.com/53e5c6d66221525b0c18113b513fc3fb?v=1532393894
题意:输入a个数,询问b次。在这a个数中找x的位置。如果找到,便输出x found at y;如果没有找到输出x not found’
思路1:(费时长)
用sort()函数排序,暴力查找x。
代码:
- #include<iostream>
- #include<algorithm>
- #define maxn 10000+10
- using namespace std;
- int s1[maxn];
- int s2[maxn];
- bool cmp(int a,int b){
- return a<b;
- }
- int main()
- {
- int N,Q;
- int num=0;
- while(scanf("%d%d",&N,&Q)!=EOF&&N!=0&&Q!=0){
- for(int i=0;i<N;i++)
- scanf("%d",&s1[i]);
- num++;
- sort(s1,s1+N,cmp);//排序
- //for(int i=0;i<N;i++)
- //printf("%d ",s1[i]);
- //printf("\n");
- printf("CASE# %d:\n",num);
- for(int j=0;j<Q;j++){
- scanf("%d",&s2[j]);
- int flag=0;
- for(int i=0;i<N;i++){
- if(s2[j]==s1[i]){
- flag=1;
- printf("%d found at %d\n",s2[j],i+1);
- break;}
- }
- if(flag==0)
- printf("%d not found\n",s2[j]);
- }
- }
- return 0;
- }
思路二:
lower_bound(s,s+a,x)-s;返回第一个不小于x的坐标
upper_bound(s,s+a,x)-s;返回第一个大于x的坐标
代码:
- #include<iostream>
- #include<algorithm>
- using namespace std;
- const int maxn=10000+10;
- int s[maxn];
- int main(){
- int a,b;
- int x;
- int num=0;
- while(scanf("%d%d",&a,&b)&&a&&b){
- for(int i=0;i<a;i++){
- scanf("%d",&s[i]);}
- sort(s,s+a);
- num++;
- printf("CASE# %d:\n",num);
- for(int j=1;j<=b;j++){
- scanf("%d",&x);
- int p=lower_bound(s,s+a,x)-s;//返回第一个不小于x的值
- if(s[p]==x)printf("%d found at %d\n",x,p+1);
- else printf("%d not found\n",x);
- }
- }
- return 0;
- }
注意:
- 本题WA好几次的原因是,没有注意输出方式。
- 以后注意使用
lower_bound upper_bound 会使程序更加完善更加简单更加迅速