题目大意:给出n和m,接下来给出n个数,先对这n个数从小到大排序,接着会有m个询问,每次输入一个数,
查找这个数是否存在。
思路:用c++的lower_bound或者暴力求解都是可以的
代码:
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010;
int n , m;
int ans[N];
int main(void)
{
int ca = 1;
while(scanf("%d %d",&n , &m) != EOF && (n ||m))
{
memset(ans , 0 , sizeof ans);
for(int i = 0 ; i < n ; ++ i) scanf("%d",&ans[i]);
sort(ans , ans + n);
printf("CASE# %d:\n",ca ++);
while(m --)
{
int t , flag = -1;
scanf("%d",&t);
for(int i = 0 ; i < n ; ++ i)
{
if(ans[i] == t)
{
flag = i;
break;
}
}
if(flag != -1) printf("%d found at %d\n",t,flag + 1);
else printf("%d not found\n",t);
}
}
return 0;
}
那么总结一下我自己的问题,不感兴趣的就可以跳过了。
代码:
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010;
int n , m;
int ans[N];
int main(void)
{
int ca = 1;
while(scanf("%d %d",&n , &m) != EOF && (n ||m))
{
memset(ans , 0 , sizeof ans);
for(int i = 0 ; i < n ; ++ i) scanf("%d",&ans[i]);
sort(ans , ans + n);
printf("CASE# %d:\n",ca ++);
while(m --)
{
int t;
scanf("%d",&t);
for(int i = 0 ; i < n ; ++i)
{
if(ans[i] == t)
{
printf("%d found at %d\n",t,i + 1);
break;
}
if(ans[i] > t)
{
printf("%d not found\n",t);
break;
}
}
}
}
return 0;
}
我一开始是这么写的,但是WA了好几次之后我才发现,问题出现在第38行那里,本来是想如果ans[i]比当前这个要查询的数大的话,就直接跳出循环就行了,这样可以优化一下。但是有可能这个条件根本不会成立,也就是说这个数列中的任意一个数都比要查询的数t要小,因此这个判定是不会判定成功的。