环状链表与它的数组模拟方案

蓝桥杯题目:能量项链

题目链接:https://www.dotcpp.com/oj/problem1255.html(这是一个蓝桥杯的题目)

下面是我的两个代码:

1、链表模拟:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<malloc.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 struct point
 8 {
 9     int q,h;
10     point *last;
11     point *next;
12     bool ishere;
13 }; 
14 int n;
15 int nums[200];
16 int cur=0;
17 int energy=0;
18 point t;
19 
20 int main()
21 {
22     t.ishere=true;
23     cin>>n;
24     int a,b;
25     cin>>a;
26     nums[cur++]=a;
27     //
28     cin>>b;
29     nums[cur++]=b;
30     t.q=a;//输入的第一个数t.q 
31     t.h=b;
32     point *lastpoint=&t;
33     a=b;
34     //设置第一个元素 
35     for(int i=0;i<n-1;i++)
36     {
37         if(i!=n-2){cin>>b;nums[cur++]=b;}
38         else b=t.q;
39         point *temp = (point*)malloc(sizeof(point));
40         temp->ishere=true;
41         temp->q=a;
42         temp->h=b;
43         temp->last=lastpoint;
44         lastpoint->next=temp;
45         a=b;
46         lastpoint=temp;
47     }
48     t.last=lastpoint;
49     lastpoint->next=&t;
50     //完成闭环操作 
51     sort(nums,nums+n);
52     //
53     //
54     for(int i=0;i<n-1;i++)
55     {
56         int aimnum=nums[i];
57         //if(aimnum==10)break;
58         //printf("aim->%d\n",aimnum);
59         point *temp=&t;
60         while(!temp->ishere)temp=temp->next;
61         while(1)
62         {
63             if(temp->h==aimnum)
64             {
65                 point *s = temp->next;
66                 energy+=(aimnum*(temp->q)*(s->h));
67                 //printf("%d->%d<-%d\n",temp->q,aimnum,s->h);
68                 temp->h=s->h;
69                 point *third = s->next;
70                 third->last=temp;
71                 temp->next=third;
72                 s->ishere=false;
73                 break;
74             }
75             temp=temp->next;
76         }
77         //完成一个两个珠子的融合 
78         //pout();
79     }
80     printf("%d\n",energy);
81     return 0;
82 }

2、数组模拟环状链表

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<malloc.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 struct point
 8 {
 9     int p;
10     int value;
11     bool operator<(const point& rhs)const
12     {
13         return this->value<rhs.value;
14     }
15 };
16 const int maxn = 103;
17 int n;
18 int q[maxn];
19 int h[maxn];
20 bool ishere[maxn];
21 int energy=0;
22 
23 int main()
24 {
25     cin>>n;
26     for(int i=0;i<n;i++)
27     {
28         cin>>q[i];
29         h[(i-1+n)%n]=q[i];
30     }
31     h[n-1]=q[0];
32     point *aim = new point[n+2]; 
33     for(int i=0;i<n;i++)
34     {
35         ishere[i]=true;
36         aim[i].value=h[i];
37         aim[i].p=i;
38     }
39     point *ender = aim+n;
40     sort(aim,ender);
41     for(int i=0;i<n-1;i++)
42     {
43         int aimi = aim[i].p;
44         int k=(aimi+1)%n;
45         while(!ishere[k])k=(k+1)%n;
46         energy+=(q[aimi]*h[aimi]*h[k]);
47         q[k]=q[aimi];
48         ishere[aimi]=false;
49     }
50     printf("%d\n",energy);
51     return 0;
52 }

虽然我尽量提高算法质量,但是上述的两个代码在测试时仍然保持着内存使用量不变,唯一不同的是代码长度[哭]。

第一个代码写起来并没有那么麻烦,而第二个算法的细节上仍然需要一些注意。

总之上述的方案提供了一种对 数组模拟环状链表 的方案。

posted @ 2020-03-05 19:18  SavenNeer  阅读(167)  评论(0编辑  收藏  举报