移動盒子uva 12657
你有一行盒子,從左到右依次編號為1,2,3,…,n。可以執行以下4種指令:
1 x y:表示把盒子x移動到盒子y的左邊(如果x已經在y的左邊則忽略此指令)。
2 x y:表示把盒子x移動到盒子y的右邊(如果x已經在y的右邊則忽略此指令)。
3 x y:表示交換盒子x和y的位置。
4:表示反轉整條鏈。
指令保證合法,即x不等於y。
例如當n=6時在初始狀態盒子序列為為:1 2 3 4 5 6;
執行1 1 4後,盒子序列為:2 3 1 4 5 6;
接下來執行2 3 5,盒子序列變為:2 1 4 5 3 6;
再執行3 1 6,盒子序列變為:2 6 4 5 3 1;
最終執行4,盒子序列變為:1 3 5 4 6 2。
【輸入格式】
輸入包含不超過10組資料,每組資料第一行為盒子數n和指令m,以下m行每行包含一條指令。
【輸出格式】
每組資料輸出一行,即所有奇數字置的盒子編號之和。位置從左到右編號為1~n。
【輸入樣例】
6 41 1 4
2 3 5
3 1 6
46 3
1 1 4
2 3 5
3 1 6
100000 1
4【輸出樣例】129
沒有用c語言寫,太麻煩了。
這裡直接使用list容器進行模擬。(由於c++是自學的,容器也不咋會用,回頭補補知識)
**模擬:
//移動盒子——鍊錶實現
//dacao
//2018/10/29
#include#includeusing namespace std;
int main()
cin>>x>>y;
for(it=box.begin();it!=box.end();it++)
if(op==1)
if(op==2)
if(op==3)
} int sum=0;
it=box.begin();
for(i=1;i<=n;i++)
cout《當然,這樣寫的結果會超時,答案是用陣列來代替雙向鍊錶,且處理很有技巧uva12657 移動盒子
鏈結中,有一行**看不懂~
想不通:if(p == 3 && right[y] == x) swap(x, y);
**來自:
#include#include#includeusing namespace std;
#define maxl 100010
int right[maxl], left[maxl];
inline void link(int l, int r)
int main()
for(i = 1; i <= m; i++)
int lx = left[x], rx = right[x], ly = left[y], ry = right[y];
switch (p)
case 2 :
case 3 :
break;
}default : break;
}} long long ans = 0;
int b = 0;
for(i = 1; i <= n; i++)
if(sta && n % 2 == 0) ans = (long long)n * (n + 1) / 2 - ans;
printf("case %d: %lld\n", cases++, ans);
} return 0;
}
Uva 12657 移動盒子(雙向鍊錶)
你有一行盒子,從左到右依次編號為1,2,3,n。可以執行以下4種指令 1 x y表示把盒子x移動到盒子y左邊 如果x已經在y的左邊則忽略此指令 2 x y表示把盒子x移動到盒子y右邊 如果x已經在y的右邊則忽略此指令 3 x y表示交換盒子x和y的位置。4 表示反轉整條鏈。指令保證合法,即x不等於y...
Uva 12657 移動盒子(雙向鍊錶)
你有一行盒子,從左到右依次編號為1,2,3,n。可以執行以下4種指令 1 x y表示把盒子x移動到盒子y左邊 如果x已經在y的左邊則忽略此指令 2 x y表示把盒子x移動到盒子y右邊 如果x已經在y的右邊則忽略此指令 3 x y表示交換盒子x和y的位置。4 表示反轉整條鏈。從操作1,2來看,需要有乙...
mysql 雙向鍊錶 雙向鍊錶
雙向鍊錶是鍊錶變型,相比於單鏈表導航或者是向前和向後的兩種方式。以下是重要的術語來理解雙向鍊錶的概念 link 鍊錶的每個鏈路儲存資料稱為乙個元素。linkedlist linkedlist包含連線鏈結到名為首先第乙個鏈結,並稱為最後的最後乙個鏈結 last 雙向鍊錶表示 按照如上圖中所示,以下是要...