尝试1(WA)
这玩意样例倒是过了,一交全WA了
先从题解里学了一个全新的读入数据的方法read(),其中getchar()的作用是每次读入一个字符
#include <bits/stdc++.h>
using namespace std;
int read() {
int x = 0, f = 1;
char c = getchar();
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
//数据范围是10e6
int a[1000010];
int main() {
int n = read(), m = read();
for (int i = 0; i < n; i++)
a[i] = read();
for (int i = 0; i < m; i++) {
int q = read();
//lower_bound用于在a,a+n范围内查找第 一 个 大 于 或 者 等 于 q的值的 地 址
//最后的-a是算出这个值到a[0]的距离
int ans = lower_bound(a, a + n, q) - a;
if (q != a[ans])
printf("-1 ");
else
printf("%d ", ans + 1);
//最后一步再+1 a[i]就是第i+1个数
}
return 0;
}
先不急着分析
我们先来看看尝试2
主要注意一下尝试2里的read()函数
尝试2(WA)
#include <bits/stdc++.h>
using namespace std;
int read() {
int x = 0, f = 1;
char c = getchar();
//注意这一个while
// while (c < '0' || c > '9') {
// if (c == '-')
// f = -1;
// c = getchar();
// }
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
int a[1000010];
int main() {
int n = read(), m = read();
//这次直接下标从1开始
for (int i = 1; i <= n; i++)
a[i] = read();
//病急乱投医 先拿个while(m--)代替for循环
while (m--) {
int q = read();
//相应的此处随着下标的变化一起更改
int ans = lower_bound(a+1, a + n+1, q) - a;
if (q != a[ans])
printf("-1 ");
else
printf("%d ", ans);
}
return 0;
}
十分诡异 被注释的while那一段是用来拦截非法数据的,但是少了这一段就是WA了 //会不会是用来检查空格的
只要把while那一段取消注释就是AC代码
到了这一步我认为这read()估计是进入祖传代码的范畴-不能改了
算了一算最大计算次数 我发现好像没有必要使用read()
于是我把前面尝试2的代码中所有读入全部改成scanf形式
https://www.luogu.com.cn/record/66180351
这玩意过了
我不想多说什么了
还是牢记lower_bound()的用法吧( '-')