反轉 開關問題 挑戰程式設計競賽

2021-10-12 07:16:52 字數 3404 閱讀 2306

例題2例題3:

農場主約翰把他的**n(1 ≤ n ≤ 5,000)**頭奶牛排成一排,很多都是面向前方的,就像好奶牛一樣。然而,有些人是面向過去的,而他需要所有人都面向未來,以使他的生活變得完美。

幸運的是,fj最近買了一台自動翻牛機。因為他購買的是折扣型,所以必須一次性轉**k(1 ≤ k ≤ n)**頭,且只能轉排在一起的奶牛。每次使用該機器時,它都會反轉該行中乙個連續的k頭奶牛組的朝向(不能在少於k頭的奶牛上使用,例如在該行的任意一端)。每頭奶牛都保持著和之前一樣的位置,但最終卻朝著相反的方向。一頭牛一開始朝前,機器就會把它向後轉,反之亦然。

因為fj必須選擇乙個單一的,不變的值k,請幫助他確定k的最小值,使機器所需的運算元量最小化,以使所有的牛面朝前。還要確定m,即使用k值使所有奶牛面向前方所需的機器操作的最小數量。

第1行:單個整數:n第2 . .n+1行:第i+1行包含乙個字元f或b,表示**cowi**是面向前還是面向後。

第1行:兩個用空格分隔的整數:k和m

7bb

fbfb

b

3 3
對於k = 3,機器必須操作三次:翻牛(1,2,3),(3,4,5),最後(5,6,7)

;//表示每頭牛的朝向

int flag[max_n]

;//flag[i]標誌以第i頭牛為首的k個位置的牛是否需要轉向 1表示需要轉向 0表示不需要轉向

intcalc

(int k)

sum +

= flag[i];if

(i - k +

1>=0)

}//類似尺取法

//最後乙個區間的情況已經被前k-1個區間確定了

//列舉這k-1個區間的sum情況

//即可判斷是否全部轉向正確

for(

int i = n - k +

1; i < n; i++)if

(i - k +

1>=0)

}return res;

}//列舉每一種的k值

void

solve()

} cout << k <<

" "<< m << endl;

}農夫約翰知道一頭智力滿足的奶牛是一頭快樂的奶牛,它會產更多的奶。他為奶牛安排了一項腦力活動,讓它們操作乙個m × n的網格**(1 ≤ m ≤ 15;1 ≤ n ≤ 15)**方片,每方片一面為黑色,另一面為白色。

正如人們所猜測的那樣,當乙個白色的瓦片翻轉時,它會變成黑色;當乙個黑色的瓦片翻轉時,它會變成白色。當奶牛翻轉瓷磚使每一塊瓷磚的白色面朝上時,它們就會得到獎勵。然而,奶牛的蹄子相當大,當它們試圖翻轉某個瓦片時,它們也會翻轉所有相鄰的瓦片(與翻轉的瓦片共享完整邊緣的瓦片)。由於拋硬幣很累人,奶牛們想儘量減少拋硬幣的次數。

幫助奶牛確定最少需要翻幾次,以及達到最少需要翻幾次的位置。如果有多種方法可以用最少的翻轉次數來完成任務,那麼在將輸出視為字串時,請返回字典排序最少的方法。如果任務不可能完成,列印一行「impossible」。

第1行:兩個用空格分隔的整數:m和n第2 . .m+1行:第i+1行描述網格第i行的顏色(從左到右),用n個空格分隔的整數,其中1表示黑色,0表示白色

第1 . .m行:每行包含n個以空格分隔的整數,每個整數指定翻轉該特定位置的次數。

//輸入

int f[20]

[20];

//儲存中間過程的按鈕情況

int ansf[20]

[20];

//儲存結果的按鈕情況

int dx[5]

=;int dy[5]

=;//查詢乙個點的顏色

intget

(int x,

int y)

return c %2;

}//查詢乙個點的顏色

//求出在第一行按鈕確定的情況下的最小運算元

intcalc()

}//檢測最後一行是否存在黑色格仔

//如果存在黑色格仔就說明這個情況不正確

for(

int i =

1; i <= n; i++

)//統計按下按鈕的次數

int res =0;

for(

int i =

1; i <= m; i++

)for

(int j =

1; j <= n; j++

) res +

= f[i]

[j];

return res;

}//求出在第一行按鈕確定的情況下的最小運算元

void

solve()

//十進位制轉換成二進位制

int num =

calc()

;if(num >=0&&

(ans <

0|| ans > num))}

if(ans <0)

cout <<

"impossible\n"

;else

cout << endl;}}

}int

main()

solve()

;return0;

}熄燈問題(openj_bailian - 2811)

反轉(開關問題)

poj3276 n頭牛排成一列,牛頭向前或向後。擁有一台自動轉向機器,設定數值k,每次使用可以令k頭連續的牛轉向。求為了讓所有的牛都面向前方需要的最少操作次數m和對應最小的k。首先交換區間順序對結果是沒有影響的,此外對同乙個區間進行兩次以上反轉是多餘的。因此,問題轉化成了求需要被反轉的區間的集合。於...

挑戰程式設計競賽(3)

給定整數a1,a2,an,判斷是否可以從中選出若干數,使他們的和恰好為k。1 n 20 1e8 ai 1e8 1e8 k 1e8 樣例1input 4 1 2 4 7 13 output yes 13 2 4 7 樣例2input 4 1 2 4 7 15 output no dfs include...

挑戰程式設計競賽 樹

二叉樹的表達 樹的遍歷 從根r到結點x的路徑長度為x的深度 depth 結點x到葉結點的最大路徑長度成為結點x的高。請編寫乙個程式,輸出給定有根樹t中各節點u的資訊。採用 左子右兄弟表示法 1 結點u的父節點 2 結點u最左側的子結點 3 結點u右側緊鄰的兄弟結點 引用u.parent即可知道結點u...