件名の説明:
定数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の要素以外は反転しません。
入力フォーマット:
各入力は、テストを含みます。各テストケースは、サブヒンジ点の反転を必要とするノードのアドレスの最初の行、N整数ノード陽性の総数(≤10^ 5)、及びK(≤N)整数陽性を与えられます番号。ノード5のアドレスは非負の整数である、NULLアドレスが-1で表されます。
次いで、N行、フォーマットの各列があります。
住所データの次
ノードアドレスがアドレスであり、データはノードの整数データに格納され、次に、次のノードのアドレスです。
出力フォーマット:
各テストケースの後にリストをリンクされ、出力順序を逆に、同一ライン上の各ノードは、入力フォーマットを占めました。
サンプル入力:
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 68237 5
68237 6 -1
分析:
Nのサイズを格納する配列を使用し、静的なリストを見るために、タイトルの読み取りを開始、処理ビット面倒。その後、私は非常に簡単にそれらに対処するために、配列の添字に対処直接行う100 000の配列サイズを開くことができると思いました。
ノートには、いくつかの可能な中間点であるがあります。
- 5桁のアドレスに必要な出力形式の整数、0を入力する必要があります。。
- 最後に、ロールオーバー領域は、kの場合、再度反転する必要がある; kは1未満である場合、元の配列は、直接的であってもよいです。
- 各ノードの次の値は、リストリバースポジションの後、次のノードの最初のアドレスの出力は、操作を保存することができる、追加の処理を行ってもよいです。一方、最後のノードは、次の出力は-1覚えています。
- 第六テストポイントは、調査は他の人が行った後、(私は確かに見つけることができない、あまりにも難しい、遼のドライ)無駄なデータであるデータへの冗長が、時の初期のnに応じて出力があるました出力の大きさ。最後に、有用なデータを書き留めるためのmycountをすることができます。
コード:
#include <cstdio>
struct node{
int add;
int num;
int next;
};
int main()
{
int firstAdd, n, k; //初始三个参数
scanf("%d %d %d", &firstAdd, &n, &k);
struct node mydata[100000], result[n], mystack[k];
int i, j = 0, add, p = 0;
int mycount = 0;
for(i = 0; i < n; i++){
scanf("%d", &add);
scanf("%d %d", &mydata[add].num, &mydata[add].next);
mydata[add].add = add;
}
i = firstAdd;
while(i != -1){
if(j == k){
//出栈,j置0
for(j--; j >= 0; j--)
result[p++] = mystack[j];
j = 0;
}
else{
//入栈
mycount++;
mystack[j++] = mydata[i];
i = mydata[i].next;
}
}
//最后一个链表块的处理
if(j == k){ //需要翻转
for(j--; j >= 0; j--)
result[p++] = mystack[j];
}
else{ //不需要翻转
int temp = j;
for(j = 0; j < temp; j++)
result[p++] = mystack[j];
}
//输出
for(i = 0; i < mycount; i++){
if(i != mycount - 1)
printf("%05d %d %05d\n", result[i].add, result[i].num, result[i + 1].add);
else
printf("%05d %d -1\n", result[i].add, result[i].num);
}
return 0;
}