• C


    乱搞一发,,竟然过了!!!

    题目大意:输入一个整数n,然后n-2行,每一行3个数字,表示一个数组中连续的3个数字,然后将这3个数字的顺序打乱,然后再将这个n-2行打乱,要求还原数组。

    题解:先找到前3个数字,第一个数字跟最后一个数字出现的次数肯定为1,所以直接找出现次数为1的点就可以了。然后第二个点的出现次数肯定为2,第三个点的出现次数为3,然后根据第二个点和第三个点去找第四个点,,,用vector来记录位置。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1E5+7;
    int arrl[N],arrm[N],arrr[N];
    int mark[N];
    vector<int >ve[N];
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n-2;i++) {
            cin>>arrl[i]>>arrm[i]>>arrr[i];
            ve[arrl[i]].push_back(i);
            ve[arrm[i]].push_back(i);
            ve[arrr[i]].push_back(i);
        }
        int pos1,pos2,pos3;
        int x;
        for(int i=1;i<=n;i++) {
            if(ve[i].size()==1) {
                pos1=i;
                x=ve[i][0];
                if(ve[arrl[x]].size()==2) pos2=arrl[x];
                if(ve[arrr[x]].size()==2) pos2=arrr[x];
                if(ve[arrm[x]].size()==2) pos2=arrm[x];
                if(ve[arrl[x]].size()==3) pos3=arrl[x];
                if(ve[arrr[x]].size()==3) pos3=arrr[x];
                if(ve[arrm[x]].size()==3) pos3=arrm[x];
                break;
            }
        }
        int pos=3;
        cout<<pos1<<" "<<pos2<<" "<<pos3<<" ";
        while(1){
            if(pos>n) break;
            else {
                 for(int i=0;i<ve[pos2].size();i++){
                    if(ve[pos2][i]==x) continue ;
                    for(int j=0;j<ve[pos3].size();j++){
                        if(ve[pos2][i]==ve[pos3][j]){
                            x=ve[pos2][i];
                            if(arrr[x]!=pos2&&arrr[x]!=pos3){
                                cout<<arrr[x]<<" ";
                                pos2=pos3;
                                pos3=arrr[x];
                            }
                            else if(arrl[x]!=pos2&&arrl[x]!=pos3){
                                cout<<arrl[x]<<" ";
                                pos2=pos3;
                                pos3=arrl[x];
                            }
                            else if(arrm[x]!=pos2&&arrm[x]!=pos3){
                                cout<<arrm[x]<<" ";
                                pos2=pos3;
                                pos3=arrm[x];
                            }
                        break;
                        }
                    }
                 }
            }
            pos++;
        }
        return 0;
    }
  • 相关阅读:
    hdu1754线段树入门
    hdu1247 字典树模板
    完全背包 poj 1384
    hdu 1541 树状数入门
    hdu 2665 划分树模板
    winhex分析磁盘目录结构(未完待续)
    取出表单中元素的js代码
    c语言检测cpu大小端模式
    firefox的cookie
    c移位实现求余
  • 原文地址:https://www.cnblogs.com/Accepting/p/11971750.html
Copyright © 2020-2023  润新知