例題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...