80 pts 求助
查看原帖
80 pts 求助
620253
MvemiY楼主2022/8/5 11:01

我和我们队一个同学时间复杂度一模一样(我看着,如有误请纠正),但是他AC了我80,到底是什么原因呢,有没有大佬帮我看看。 我的代码:80

#include<bits/stdc++.h>
using namespace std;
int a[200010], n, k;
struct fruit{
	int num, ao;
};
typedef struct LNode{
	queue <fruit> Q;
	int kind;
	LNode *nxt, *prior;
}LNode, *LinkList;
LinkList L, R, s;
int main(){
	L = new LNode;
	L->nxt = L->prior = NULL;
	L->Q.front().num = -1;
	R = L;
	cin >> n;
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	for(int i = 1; i <= n; ){
		s = new LNode;
		fruit Now;	Now.num = i, Now.ao = a[i];
		s->Q.push(Now);
		s->kind = Now.ao;
		int j;
		for(j = i + 1 ; j <= n && a[j] == a[j - 1]; j++){
			Now.num = j, Now.ao = a[j];
			s->Q.push(Now);
		}
		k++;
		i = j;
		R->nxt = s;
		s->prior = R;
		R = s;
	}
	R->nxt = NULL;
	while(L != R && k ){
		for(LinkList p = L->nxt; p ; p = p->nxt){
			if(p->Q.empty())		continue;
			if(p == L->nxt || p->kind != p->prior->kind){
				printf("%d ", p->Q.front().num);
				p->Q.pop();
			}
		}
		for(LinkList p = L->nxt; p ;p = p->nxt)
			if(p->Q.empty()){
				if(k == 1)
					exit(0);
				if(p == L->nxt){
					LinkList tem = L->nxt;
					tem->nxt->prior = L;
					L = L->nxt;
					L->prior = NULL;
					free(L->prior);
				}
				else if(p == R){
					R = R->prior;
					free(R->nxt);
					R->nxt = NULL;
				}
				else {
					LinkList q;
					q = p->nxt;
					p->prior->nxt = q;
					q->prior = p->prior;
					free(p);
				}
				k--;
			}
		puts("");
	}
	return 0;
}

同学的代码:AC

#include <bits/stdc++.h>
using namespace std;
struct Node{
	int data, next, prev;
}List[200005], plist[200005];
int arr[200005], n, len;
void dele(int x){
	int nxt = plist[x].next, pre = plist[x].prev;
	plist[nxt].prev = pre;
	plist[pre].next = nxt;
}
void putin(int x){
	int nxt = List[x].next, pre = List[x].prev;
	List[nxt].prev = pre;
	List[pre].next = nxt;
	printf("%d ", x);
}
int main(){
	scanf("%d", &n);
	arr[0] = arr[n + 1] = 0x3f3f3f3f;
	plist[0].next = 1;
	for(int i = 1; i <= n; i++){
		scanf("%d", &arr[i]);
		List[i].next = i + 1;
		List[i].prev = i - 1;
		List[i].data = i;
	}
	for(int i = 1; i <= n; i++){
		if(arr[i] != arr[i - 1]){
			plist[++len].data = i;
			plist[len].next = len + 1;
			plist[len].prev = len - 1;
		}
	}
	while(List[0].next != n + 1){
		int head = plist[0].next;
		int fruit = arr[plist[head].data];
		while(head != len + 1){
			if(fruit != arr[plist[head].data]){
				dele(head);
				head = plist[head].next; 
				continue;
			}
			putin(plist[head].data);
			plist[head].data = List[plist[head].data].next;
			if(fruit != arr[plist[head].data]){
				dele(head);
			}
			fruit = !fruit;
			head = plist[head].next; 
		}
		putchar('\n');
	}
	return 0;
} 

思路也基本上是一模一样的啊。

2022/8/5 11:01
加载中...