時間限制:3000 ms | 記憶體限制:65535 kb
難度:3
描述有乙個數列a1,a2,a3...an,每次可以從中任意選三個相鄰的數ai-1 ,ai , ai+1 ,進行如下操作(此操作稱為「對ai進行操作」)
(ai-1,ai,ai+1)->(ai-1+ai,-ai,ai+ai+1)
給定初始和目標序列,是否能通過以上操作,將初始序列轉換成為目標序列?例如,初始序列(1 6 9 4 2 0)目標序列(7 -6 19 2 -6 6)可經過如下操作:
(1 6 9 4 2 0)->( 1 6 13 -4 6 0)->(1 6 13 2 -6 6)->(7 -6 19 2 -6 6)
請你判斷給定的初始狀態和目標狀態,輸出yes(能夠轉換)或no(不能轉換)
輸入第一行是乙個正整數n,表示測試資料的組數。(n<=100)
每組測試資料的第一行是乙個整數m(3<=m<=1000),表示該組測試資料的起始狀態與結束狀態都有m個數。
每組測試資料的第二行是m個整數ai(-1000<=ai<=1000),表示起始狀態。
每組測試資料的第三行是m個整數bi(-1000<=bi<=1000),表示終止狀態。
輸出如果能夠轉換,輸出yes
如果不能轉換,輸出no
樣例輸入
2樣例輸出31 2 3
1 3 2
61 6 9 4 2 0
7 -6 19 2 -6 6
no理解:說的高大上一點這道題用到了守恆定律,剛開始我也很懵逼,後來分析了一下題意,發現(ai-1,ai,ai+1)->(ai-1+ai,-ai,ai+ai+1)的過程中總和是不變的,即(ai-1 + ai + ai+1) == (ai-1+ai + -ai + ai+ai+1),於是雖然不是很懂,但還是略有所思(裝逼)地對自己點了點頭。以下分析拷貝別人的(和yes
我們看這道題是從(an-1,an,an+1)轉化到(an-1+an,-an,an-1+an),三個數的和是不變的。
那我們就想到是否數列額總和一樣,兩個數列就可以互達呢?
在我們下結論之前肯定要舉幾個例子,驗證一下。
好現在考慮(1 2 3)(1 3 2)
(1 2 3)→(3,-2,5)→(1 2 3)所以這個想法是不行的
總和雖然不行,我們可以試著考察區域性和(即前n項和)
(an-1,an,an+1) (an-1+an,-an,an-1+an)
sn-1=an-1 s』n-1=an-1+an
sn=an-1+an s』n=an-1
sn=an-1+an+an+1 s』n+1=an-1+an+an+1
可以看到前後兩個數列的前兩項是位置是相反的,最後乙個位置是不變的。
很容易的,我們推廣一下:sn=a1+a2+a3+...+an-1+an,那麼題述規則就是相當於交換sn-1.sn,也就是說,兩個數列,分別求前n項和,排序後,看是否對應相等。
**:
#include#include#include#define m 1005
int cmp(const void *a,const void *b)
bool isequal(int *a,int *b,int n)
int main()
for(i=0;iqsort(a,m,sizeof(int),cmp);
qsort(b,m,sizeof(int),cmp);
if(isequal(a,b,m))
printf("yes\n");
else
printf("no\n");
} return 0;
}
nyoj 109 數列轉換
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 有乙個數列a1 a2,a3 an 每次可以從中任意選三個相鄰的數ai 1 ai ai 1 進行如下操作 此操作稱為 對ai 進行操作 ai 1,ai,ai 1 ai 1 ai,ai,ai ai 1 給定初始和目標序列,是否能通過...
nyoj109 數列轉換
時間限制 3000 ms 記憶體限制 65535 kb 難度 3描述 有乙個數列a1 a2,a3 an 每次可以從中任意選三個相鄰的數ai 1 ai ai 1 進行如下操作 此操作稱為 對ai 進行操作 ai 1,ai,ai 1 ai 1 ai,ai,ai ai 1 給定初始和目標序列,是否能通過以...
NYOJ109 數列轉換 守恆技巧 數學
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 有乙個數列a1 a2,a3 an 每次可以從中任意選三個相鄰的數ai 1 ai ai 1 進行如下操作 此操作稱為 對ai 進行操作 ai 1 ai,ai 1 ai 1 ai,ai ai ai 1 給定初始和目標序列,是否能通過...