生活随笔
收集整理的這篇文章主要介紹了
sdut-oj-4205-寻找关键点
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Description
現(xiàn)定義關(guān)鍵點(diǎn)為一條鏈中處于中間位置的節(jié)點(diǎn),例如 1 3 4中,3就是這個(gè)整數(shù)鏈中的關(guān)鍵點(diǎn)。
現(xiàn)在小玉得到了一個(gè)整數(shù)鏈,確保鏈中的各個(gè)數(shù)都互不相同且數(shù)列中數(shù)的個(gè)數(shù)為奇數(shù)。
可是,由于小玉的一些特殊要求,她可能會(huì)對(duì)這個(gè)鏈進(jìn)行一些特別的操作。
操作 1 :給定兩個(gè)數(shù)a和b,每次刪除鏈中值為a和值為b兩個(gè)節(jié)點(diǎn)。
操作 2 :給定兩個(gè)數(shù)a和b,每次在鏈中值為1的節(jié)點(diǎn)后插入a,在鏈中值為2的節(jié)點(diǎn)后插入b。
由于小玉特殊的要求,她保證鏈中肯定會(huì)有值為1和2的節(jié)點(diǎn),并且這兩個(gè)節(jié)點(diǎn)永遠(yuǎn)不會(huì)被刪除。保證在插入操作之后鏈中始終不會(huì)有重復(fù)值的節(jié)點(diǎn)。
現(xiàn)在請(qǐng)你寫出一個(gè)程序,幫助小玉找出鏈中的關(guān)鍵點(diǎn)。
Input
只有一組數(shù)據(jù)
先輸入一個(gè)整數(shù)n(10<=n<=100000),且保證n一定為奇數(shù)
接下來(lái)輸入n個(gè)互不相同的整數(shù)num(1<=num<=10000000)
接著下一行輸入一個(gè)整數(shù)m(1<=m<=4000)
代表接下來(lái)有m行
每行有3個(gè)數(shù)aa,bb,cc. 其中第一個(gè)數(shù)aa表示操作類型,aa為1代表刪除鏈中值為bb和cc的數(shù),
aa為2代表在鏈中值為1的節(jié)點(diǎn)后增加值為bb的節(jié)點(diǎn),在鏈中值為2的節(jié)點(diǎn)后增加值為cc的節(jié)點(diǎn)。
(保證刪除的節(jié)點(diǎn)在鏈中一定有,保證插入的節(jié)點(diǎn)與鏈中已有節(jié)點(diǎn)不會(huì)重復(fù))
Output
對(duì)于每次操作,輸出一個(gè)值h,代表操作完成后鏈中的關(guān)鍵點(diǎn)。
Sample
Input
5
1 3 4 5 2
2
1 3 4
2 3 4
Output
5
5
#include<bits/stdc++.h>using namespace std
;int n
;typedef struct node
{int data
;struct node
*next
;
} List
;List
*creat(int n
)
{List
*head
, *tail
, *p
;head
= new List
;head
->next
= NULL;tail
= head
;for(int i
= 0; i
< n
; i
++){p
= new List
;scanf("%d", &p
->data
);p
->next
= NULL;tail
->next
= p
;tail
= p
;}return head
;
}void List_one(List
*head
, int a
, int b
)
{List
*p
, *q
;p
= head
;q
= head
->next
;while(q
->next
){if(q
->data
== a
){p
->next
= q
->next
;free(q
);q
= p
->next
;n
--;}else if(q
->data
== b
){p
->next
= q
->next
;free(q
);q
= p
->next
;n
--;}else{p
= q
;q
= q
->next
;}}if(q
->next
== NULL){if(q
->data
== a
){p
->next
= q
->next
;free(q
);n
--;}else if(q
->data
== b
){p
->next
= q
->next
;free(q
);n
--;}}
}void List_two(List
*head
, int a
, int b
)
{List
*p
, *q
;p
= head
->next
;while(p
){if(p
->data
== 1){q
= new List
;q
->data
= a
;q
->next
= p
->next
;p
->next
= q
;n
++;}if(p
->data
== 2){q
= new List
;q
->data
= b
;q
->next
= p
->next
;p
->next
= q
;n
++;}p
= p
->next
;}
}int findkey(List
*head
, int n
)
{List
*p
;int m
, k
;m
= n
/ 2 + 1;p
= head
->next
;k
= 1;while(k
!= m
){p
= p
->next
;k
++;}return p
->data
;
}int main()
{int a
, b
, m
, num
, key
;List
*head
;scanf("%d", &n
);head
= creat(n
);scanf("%d", &m
);while(m
--){scanf("%d%d%d", &num
, &a
, &b
);if(num
== 1){List_one(head
, a
, b
);}else{List_two(head
, a
, b
);}key
= findkey(head
, n
);printf("%d\n", key
);}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的sdut-oj-4205-寻找关键点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。