時間限制:
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
樣例輸入
231 2 3
1 3 2
61 6 9 4 2 0
7 -6 19 2 -6 6
樣例輸出
noyes
//不是在細節上關注表面變化,而是從整體上看到某些不變的東西,自然而然的去考慮和,然後是區域性和。
//用s[i]表示a[0...i]的和,當對a[i]進行變化的時候,直接結果是s[i]和s[i-1]交換了位置,所以轉換成了求s陣列,排序。
//然後比較兩個s陣列是否相等。比如 1 2 3 。s1=1 s2=3 s3=6 變化之後為 3 -2 5 。s1=3 s2=1 s3=6 也就是說變化第2個數相當於s1和s2互換
#include#include#includeusing namespace std;
int main()
for(int i=1;i<=n;i++)
sort(a+1,a+n);//因為該轉換操作只能從第二個數開始
sort(b+1,b+n);
if(equal(a+1,a+n+1,b+1))//判斷陣列是否相同的equal函式 返回兩個範圍是否相等
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 給定初始和目標序列,是否能通過...
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 給定初始和目標序列,是否能通過...