AtCoder Beginner Contest 337

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;
}
posted @ 2024-01-21 10:53  拍手称快  阅读(22)  评论(0编辑  收藏  举报