数据结构基础_链表
链表
说实话,感觉链表用的不是很彻底,,,
移动小球
题目:你有一些小球,从左到右编号1,2,3,....,n。输入小球个数n,指令条数m,从左到右输出最后的序列。注意n可高达50000,而m可高达100000。
输入:
6 2
A 1 4
B 3 5
输出:
2 1 4 5 3 6
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define MAXN 500005 5 6 int lft[MAXN],rgt[MAXN]; 7 8 int main() 9 { 10 int p,q,i,n,m; 11 char type[2]; 12 scanf("%d%d",&n,&m); 13 for(i = 0; i <= n+1; i++) 14 { 15 lft[i] = i-1; 16 rgt[i] = i+1; 17 } 18 for(i = 0; i < m; i++) 19 { 20 scanf("%s%d%d",type,&p,&q); 21 //lft[p]/p/rgt[p]。把中间的p删除 22 rgt[lft[p]] = rgt[p]; 23 lft[rgt[p]] = lft[p]; 24 //在 lft[q]/q之间插入q. 25 if(type[0] == 'A') 26 { 27 rgt[lft[q]] = p; 28 lft[p] = lft[q]; 29 lft[q] = p; 30 rgt[p] = q; 31 } 32 //在q/rgt[q]之间插入p. 33 else 34 { 35 lft[rgt[q]] = p; 36 rgt[p] = rgt[q]; 37 rgt[q] = p; 38 lft[p] = q; 39 } 40 } 41 //最右边为n+1 42 int front = rgt[0]; 43 while(rgt[front] != n+2) 44 { 45 printf("%d ",front); 46 front = rgt[front]; 47 } 48 // printf("%d\n",front); 49 return 0; 50 }
对比测试
嗯,单纯的生成随机数
1 #include <stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 int n=100,m=100000; 5 double random(){//生成[0,1]之间的均匀随机数 6 return (double)rand()/RAND_MAX; 7 } 8 int random(int m){//生成[0,m-1]之间的均匀随机数 9 return (int)(random()*(m-1)+0.5); 10 } 11 int main() { 12 srand(time(NULL));//初始化随机数种子 13 printf("%d %d\n",n,m); 14 int k=0; 15 for(int i=0;i<m;i++){ 16 if(rand()%2==0)printf("A");else printf("B"); 17 int X,Y; 18 for(;;){ 19 X=random(n)+1; 20 Y=random(n)+1; 21 if(X!=Y) break; 22 } 23 k++; 24 printf(" %d %d %d\n",k,X,Y); 25 26 } 27 return 0; 28 }
输出部分结果: