CH-Round-#63-OrzCC杯#2省选热身赛
題目一
描述
exchange
背景
有n個人一同出去玩,每個人有一張火車票。由于火車票實行實名制,每張火車票也對應一個人。
描述
由于某種原因,現在出現了以下情況:每個人手中有一張票,這張票可能是自己的也可能是別人的。現在任意兩個人之間可以交換手中的票,求最少進行多少次交換使得每個人都拿到自己的票。假定交換是依次進行的,即同一時刻只進行一次交換,我們也想知道,第一步有多少種方案,能保證交換次數最少。
輸入格式
輸入有2行,第一行有兩個用空格隔開的正整數n、k(k代表任務種類,詳見輸出格式),第二行有n個用空格隔開的正整數,第i個為Pi,代表著第i個人手中的票是第Pi個人的。
輸出格式
如果k=1,那么輸出只有一個整數,表示最少交換的次數;如果k=2,那么輸出有兩行,第一行是一個整數,表示最少交換的次數,第二行有一個整數,表示第一步的方案數。
分析
- 找到所有的循環, 每個循環中置換次數是這個循環中元素的個數-1. 把所有的都加起來就得到總次數. 這個可以參考codevs的排序的代價, 不過這里代價都是0.
- 如果再來做第二問, 在一個循環中, 假設循環中元素的個數是n, 第一步選兩個元素交換, 第一個元素有n種選擇, 第二個元素有n-1種選擇. 最終交換a和b與交換b和a是一樣的, 所以這個循環中第一步選擇的方案數是n*(n-1)/2.
題目二
描述
在某一時刻,存活的獅子有地位高低之分,能力值高的地位高,能力值相同的當中年齡大的地位高。任何時刻,地位最高的獅子可以吃掉地位最低的獅子,但如果這樣做,地位最高的獅子能力值會減少它吃掉的獅子的能力值。假定所有獅子都足夠聰明,并且在保證自己不死的前提下會盡量吃掉別的獅子。現給出每個獅子的年齡和能力值,求哪些獅子死了。
輸入格式
輸入有2行,第一行有一個正整數n。第二行有n個用空格隔開的正整數,按年齡從小到大依次給出每個獅子的能力值,并按輸入順序編號為1~n。
輸出格式
輸出有2行,第一行有一個整數m,表示死去的獅子的個數。第二行有m個用空格隔開的正整數,為死去的獅子在輸入中的編號(請從小到大輸出)。
分析
看來直接遞歸是最好的辦法了.
在遞歸過程中用一個棧來保存先后死掉的獅子. 先假設當前最厲害的獅子A吃掉了最弱的獅子B, 遞歸下一層直到只剩一只獅子, 然后返回處理, 如果當前A在后來被吃掉了, 那么獅子A一定不會吃掉B, 就在棧中找到B, 把它和以上的元素都退棧. 吃掉的獅子個數修改為當前的遞歸層數.還有其他辦法不用遞歸, 但都看不太懂. 遞歸最直接了.
- 獅子的信息可以用pair存, 自動按兩維排序.
題目四
描述
背景
有兩種液體A和B,等量混合時完全反應生成氣體揮發不留渣;不等量混合時等量部分發生上述反應,多出部分留下。
描述
現有n個杯子排成一排,每個杯子里裝有一種液體。我們可以進行若干次如下操作:選擇兩個相鄰的杯子,這兩個杯子中的液體種類必須是不同的,將其中一個杯子里的液體全部倒入另一個杯子中(杯子容積很大,不考慮溢出),反應充分之后拿走所有空杯子(拿走空杯子可以使原本不相鄰的杯子變得相鄰)。給出一個初始狀態,求最少剩下多少個杯子。
輸入格式
輸入有n+1行,第一行有一個正整數n,接下來的n行,每行格式為“Vi Ki”,Vi為一正整數,表示這排杯子從左數第i個杯子的液體量,Ki為一個字符A或B,表示這排杯子從左數第i個杯子里液體的種類。
輸出格式
輸出有一個整數,表示最少剩下的杯子數。
分析
- 見官方題解http://pan.baidu.com/s/1eQjateM
- 平衡樹想了想用splay寫的
代碼
https://code.csdn.net/snippets/615224
總結
以上是生活随笔為你收集整理的CH-Round-#63-OrzCC杯#2省选热身赛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ-2659-算不出的算式
- 下一篇: BZOJ-几道比较有趣的题目