PAT(B級)1015反転チェーンテーブル(25)(ちょっと問題あり)
2641 ワード
テーマの出所:http://www.nowcoder.com/pat/6/problem/4051
タイトルの説明
説明を入力:
出力の説明:
入力例:
出力例:
1:構造体配列を用いて初めて情報を格納し、その後、アドレス情報に基づいて双方向チェーンテーブルのチェーンテーブル形式に直列に接続し、最後に反転長値に基づいて対応情報を出力する.しかし明らかにタイムアウトしており、構造体チェーンテーブルに直列する際の時間的複雑度O(n^2)である.
2:次に検索方法を修正し,Mapを用いて保存し,アドレス順に別の構造体配列に格納し,反転長さに応じて情報を出力する.
結局タイムアウトです.
3:ネット上の考えを参考にして、3組の1次元int配列を使用して保存し、アドレスは5ビットであるため、アドレス情報は単独で保存する必要はなく、変更アドレスに対応する情報を直接そのアドレスとしてマークされた配列位置に存在させ、その後、ヘッダheadとnext配列に基づいてリスト配列にアドレス情報を順次保存し、その後、反転長さに基づいて情報を出力する.今回はタイムアウトしていませんが、2つのテストポイントが合格していません.長い間変更しても合格していません.大神たちに見てもらいたいのですが、どこの問題ですか.
タイトルの説明
K L, L K 。 : L 1→2→3→4→5→6,K 3,
3→2→1→6→5→4; K 4, 4→3→2→1→5→6, K 。
説明を入力:
1 。 1 1 、 N(<= 105)、 K(<=N),
。 5 ,NULL -1 。
N , :
Address Data Next
Address ,Data ,Next 。
出力の説明:
, , , 。
入力例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
出力例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
アルゴリズムの考え方ははっきりしています.1:構造体配列を用いて初めて情報を格納し、その後、アドレス情報に基づいて双方向チェーンテーブルのチェーンテーブル形式に直列に接続し、最後に反転長値に基づいて対応情報を出力する.しかし明らかにタイムアウトしており、構造体チェーンテーブルに直列する際の時間的複雑度O(n^2)である.
2:次に検索方法を修正し,Mapを用いて保存し,アドレス順に別の構造体配列に格納し,反転長さに応じて情報を出力する.
結局タイムアウトです.
3:ネット上の考えを参考にして、3組の1次元int配列を使用して保存し、アドレスは5ビットであるため、アドレス情報は単独で保存する必要はなく、変更アドレスに対応する情報を直接そのアドレスとしてマークされた配列位置に存在させ、その後、ヘッダheadとnext配列に基づいてリスト配列にアドレス情報を順次保存し、その後、反転長さに基づいて情報を出力する.今回はタイムアウトしていませんが、2つのテストポイントが合格していません.長い間変更しても合格していません.大神たちに見てもらいたいのですが、どこの問題ですか.
#include
#include
using namespace std;
int main()
{
int head,N,len,n;
int i,j;
int val[100001]={0};
int next[100001]={0};
int list[100001]={0};
int final[100001]={0};
cin>>head>>N>>len;
for(i=1;i<=N;i++)
{
int link;
cin>>link;
cin>>val[link]>>next[link];
}
n=1;
while(head!=-1)
{
list[n]=head;
head=next[head];
n++;
}
int low=0;
n--;
while(low+len<=n)
{
for(j=low+len;j>low+1;j--)
{
printf("%05d %d %05d
",list[j],val[list[j]],list[j-1]);
}
printf("%05d %d ",list[j],val[list[j]]);
low+=len;
if(low==n)
{
printf("%d
",-1);
break;
}
else if(low+len>n)
{
printf("%05d
",list[low+1]);
for(j=low+1;j