不会题解里那些高大上的数据结构,所以用字符数组做的伪链表,比一般的链表快,但是第一个点过不了
伪链表(只挂第一个):
#include<stdio.h>
#include<stdlib.h>
char a[2000001]={'\0'};
int main(void)
{
int n,i,t,sum=0,min,max;
int o,u;
scanf("%d",&n);
scanf("%d",&t);
sum+=t;
min=max=t;
a[t+1000000]='1';
for(i=1;i<n;i++)
{
scanf("%d",&t);
if(a[t+1000000]=='1') continue;
a[t+1000000]='1';
if(t<min)
{
sum+=min-t;
min=t;
continue;
}
if(t>max)
{
sum+=t-max;
max=t;
continue;
}
o=t-1;
u=t+1;
while(a[o+1000000]!='1') o--;
while(a[u+1000000]!='1') u++;
sum+=u-t>t-o?t-o:u-t;
}
printf("%d",sum);
return 0;
}
普通链表(挂了5和6):
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct day
{
int data;
struct day *next;
};
struct day *create(void)
{
struct day *p=(struct day *)malloc(sizeof(struct day));
p->next=NULL;
return p;
}
int insert(struct day *head,int t)
{
struct day *p,*q;
p=head;
q=head->next;
if(t<q->data)
{
struct day *o=(struct day *)malloc(sizeof(struct day));
o->data=t;
p->next=o;
o->next=q;
return (int)abs(t-q->data);
}
while(t>q->data)
{
if(q->next==NULL)
{
struct day *o=(struct day *)malloc(sizeof(struct day));
o->data=t;
o->next=NULL;
q->next=o;
return (int)abs(t-q->data);
}
p=p->next;
q=q->next;
}
if(t==q->data) return 0;
else
{
struct day *o=(struct day *)malloc(sizeof(struct day));
o->data=t;
p->next=o;
o->next=q;
return (int)(abs(t-q->data))>(abs(t-p->data))?(abs(t-p->data)):(abs(t-q->data));
}
}
int main(void)
{
struct day *head=create(),*a=(struct day *)malloc(sizeof(struct day));
head->next=a;
a->next=NULL;
int n,sum=0,t,i;
scanf("%d",&n);
scanf("%d",&t);
a->data=t;
sum+=t;
for(i=0;i<n-1;i++)
{
scanf("%d",&t);
sum+=insert(head,t);
}
printf("%d",sum);
return 0;
}