POJ1063 Flip and Shift
題目來源:http://poj.org/problem?id=1063
題目大意:
有一種游戲如圖所示。一個填滿黑白球的轉盤,它可以有兩種操作,一種是將大轉盤順時針旋轉,所有球的位置順時針挪一位,另一種是轉動小轉盤,使位于小轉盤處的三個小球顛倒位置。游戲的目標是達到下面的圖片所示的狀態,黑球與白球都處在連續的位置上。
寫一個程序判斷給出的球序列是否可能通過上述的兩種操作達到目標序列。
輸入:第一行為測試用例數T。每個用例第一個數為小球的數目n, 接下來是n個0和1組成的序列,每個數字用空格隔開,0表示白球,1表示黑球。n的值在10到30之間。輸出:如可能達到目標,輸出一行“YES”, 否則“NO”
?Sample Input
2 18 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 1 14 1 1 0 0 1 1 1 0 0 1 1 0 1 0Sample Output
YES NO?觀察和琢磨上面的兩種對于球的操作,我們可以發現,其實規則等價于可以把任意三個相鄰的三個球位置顛倒。考慮兩種情況:
?1. 球的總數為偶數,那么奇數位的球永遠到不了偶數位上,反之亦然。
?2. 球的總數為奇數,那么任意一個球都可以到達其它任意一個位置上,這種情況下總可以達到目標狀態。
再考慮球總數為偶數時,實際上可以把操作對球顏色順序的影響分離為對奇數位上球的影響和對偶數位球的影響。我們想象把所有偶數位的球固定,通過旋轉可以調換奇數位上相鄰的球,通過不斷的調換可以把奇數位上黑球調至相鄰位置。同樣我們可以把偶數位上的黑球調至連續的位置。接下來還要考慮何種情況下才能使整個大轉盤上的球可以達到不存在黑白相間的情況。答案是:奇數位上的黑球個數與偶數位上黑球的個數相差不超過1. 這就是球總數為偶數時能達到目標狀態的充要條件。
附上兩個版本的代碼。(直觀版和技巧版)
1 //// 2 // POJ1063 Flip and Shift 3 // Memory: 208K Time : 16MS 4 // Language : C++ Result : Accepted 5 //// 6 7 #include <iostream> 8 9 using namespace std; 10 11 int even_black, odd_black; 12 int buf, cnt; 13 14 int main(void) { 15 int T; 16 cin >> T; 17 for (int case_id = 1; case_id <= T; ++case_id) { 18 cin >> cnt; 19 even_black = odd_black = 0; 20 for (int i = 0; i < cnt; ++i) { 21 cin >> buf; 22 if (buf == 1) { 23 if (i % 2 == 1) { 24 ++odd_black; 25 } else { 26 ++even_black; 27 } 28 } 29 } 30 if (cnt % 2) { //總球數為奇 31 cout << "YES" << endl; 32 } else if (odd_black - even_black > 1 || odd_black - even_black < -1) { 33 cout << "NO" << endl; 34 } else { 35 cout << "YES" << endl; 36 } 37 } 38 return 0; 39 } View Code 1 //// 2 // POJ1063 Flip and Shift 3 // Memory: 208K Time : 0MS 4 // Language : C++ Result : Accepted 5 //// 6 7 #include <iostream> 8 9 using namespace std; 10 11 int r[2]; 12 int buf, cnt; 13 14 int main(void) { 15 int T; 16 17 cin >> T; 18 for (int case_id = 1; case_id <= T; ++case_id) { 19 cin >> cnt; 20 r[0] = r[1] = 0; 21 for (int i = 0; i < cnt; ++i) { 22 cin >> buf; 23 r[i % 2] += buf; 24 } 25 cout << (cnt % 2 || r[1] - r[0] < 2 && r[1] - r[0] > -2 ? "YES" : "NO") << endl; 26 } 27 return 0; 28 } View Code轉載于:https://www.cnblogs.com/dengeven/p/3425061.html
總結
以上是生活随笔為你收集整理的POJ1063 Flip and Shift的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于mysql的error-based
- 下一篇: 搞定ubuntu下环境变量的配置