明天好像要考链表今晚笔者来了解下。
解:
对于这道题,由于前面要与后面重新连起来,于是我们考虑链表。
我们先正常用链表维护关系。然后,我们从大到小枚举。
对于这个数,如果它后面有数(因为是一对一起进入),就把它们压入队列(输出即可)
这样就利用链表完成了一个贪心的过程。
Code:
#include<list> #include<iostream> #include<cstdio> using namespace std; int head[500000],Next[500000]; int n,a[500000]; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); head[a[i]]=a[i-1]; Next[a[i-1]]=a[i]; } for(int i=n;i>=1;--i){ if(Next[i]){//这里是i,故从小到大。 printf("%d %d ",i,Next[i]); Next[head[i]]=Next[Next[i]]; head[Next[Next[i]]]=head[i];//i Next[Next[i]].head=head[i]. Next[Next[i]]=0;//即 head[Next[Next[i]]]=head[i]. } } return 0; }