AtCoder Beginner Contest 337
赛后总结
A题不多说,纯水。
B题对题目要求没有理解太透(不知道是英语问题,还是它样例给的不够全,没太能理解最后的那个判断结果)
卡c题上了
c题感觉其实是个比较有意思的题,但是只要理解了题目就知道本质是一个求数组对应的下标,再以数组的下标所对应的数组值来求下一个下标。
- 我的错误思路
我一开始没太完全看懂样例,和它给的数组条件,我以为数组的值是除-1这个特定值去都是依次递增了,但样例3就有揭示这个问题,我看半天没看出来,想用sort排序来寻找下标对应的值的下标。 - 正确思路
通过观摩别人的解答,收获了一种新思路。
应该放弃第一个特殊值-1,正常是通过首位数-1再去求它的下标,然后再找-1的下标对应的数组值得下标,重复这个过程。但其实由于首位是固定的,转换思路,以-1的下标去求值再得新下标,重复。
因为数组的值是需要遍历才能知道的,而下标可以直接定位所在的值。
这样我们就有种新的数组方式存储数组
将数组的值为下标,原本的下标变为值,这样我们就可以以值为下标的方式直接调用出下一个的下标。
代码:
#include <iostream>
using namespace std;
int r[1000000];
int main(){
int n;
cin >> n;
int s;
int next;
for (int i = 1; i <= n; i++){
cin >> s;
r[s] = i;
if (s == -1){
cout << i << " ";
next = i;
}
}
for (int i = 2; i <= n; i++){
cout << r[next] << " ";
next = r[next];
}
cout << endl;
return 0;
}