給定奇數版, 和兩種狀態a b
問能否有解使板a 變為板 b
例:解: 將板a, b化為一維向量,1 2 3
0 4 6
7 5 8
1 2 3
4 5 6
7 8 0
轉化為逆序對問題
首先去掉位0
有 1.空格的左右移動不影響整個串的順序
2.空格的上下移動必有等價與 swap(s[i], s[i - n - 1]) / swap(s[i], s[i + n - 1])
因為n - 1 為偶數, 所以逆序對的改變只能為偶數
由以上推導, 若a, b向量的 逆序對奇 偶性相同, 則必定可以轉換得解
/*
zeolim - an ac a day keeps the bug away
*///pragma gcc optimize(2)
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
int arr[maxn];
int brr[maxn];
int revnum = 0;
void mergesort(int *arr, int fst, int lst, int *brr)
else
}for(i = fst; i < lst; i++)
arr[i] = brr[i]; }}
int main()
revnum = 0;
mergesort(arr, 0, n * n - 1, brr);
int ra = revnum;
for(int i = 0, j = 0, y; i < n * n; ++i)
revnum = 0;
mergesort(arr, 0, n * n - 1, brr);
int rb = revnum;
if((ra & 1) && (rb & 1) || (!(ra & 1) && !(rb & 1)))
cout<<"tak\n";
else
cout<<"nie\n";
}return 0;
}
思維 奇數碼問題
給定奇數版,和兩種狀態a b 問能否有解使板a 變為板 b 例 1 2 3 0 4 6 7 5 8 1 2 3 4 5 6 7 8 0 解 將板a,b化為一維向量,轉化為逆序對問題 首先去掉位0 有 1.空格的左右移動不影響整個串的順序 2.空格的上下移動必有等價與 swap s i s i n 1...
Ahahahahahahahaha 思維 奇偶性
題意 01串使得奇數字的和與偶數字的和相等,規定了輸入的長度為偶數。思路 考慮1的個數多還是0的個數多,取個數多的那乙個。如果個數多的是奇數個,就減1,不然就是偶數個必然能滿足條件。然後for一遍輸出一定個數的1也是遵守題目的出現順序。include include include include ...
奇數碼問題
你一定玩過八數碼遊戲,它實際上是在乙個3 3的網格中進行的,1個空格和1 8這8個數字恰好不重不漏地分布在這3 3的網格中。例如 528 13 46 7在遊戲過程中,可以把空格與其上 下 左 右四個方向之一的數字交換 如果存在 例如在上例中,空格可與左 上 下面的數字交換,分別變成 528 52 5...