有n頭牛,沒頭牛都有自己的暴躁指數,並且互補相同,要把這些牛按暴躁指數從小到大排列,每次交換兩頭牛,消耗的體力為兩頭牛的暴躁指數和。
應用的知識為置換。
如把 1 2 3 4 5 6 變成 6 3 4 2 1 5 發現可以分成兩組來交換,第一組是(6 1 5) 第二組為(2,3,4) 只需交換組內的元素就可以完成變換。所以第一步就先分組,在這道題中採用的方法是把元素排序,然後和原來的序列對比。
那麼每組內怎樣交換最省體力?有兩種方法,1.組內的每個元素都和暴躁指數最小的那個交換,共需交換k-1次,2.先把所有牛中暴躁指數最小的那個放到組內,然後進行組內交換,最後再把組內最小的那個交換回來。
#include#include#includeusing namespace std;
int num[10010],vis[10010],table[100001],c[10010],minn[10010],sum[10010],minnest,tot[10010];//num記錄原始的資料,c記錄排序後的資料,table充當hash的作用,table〔i〕=j代表第j頭牛的暴躁指數為i,vis記錄是否分過組,minn記錄每組內的最小值,sum記錄每組的和,tot記錄每組內的元素個數,minnest記錄所有元素的最小值
int main()
{ int n;
while(cin>>n)
{minnest=0x3f3f3f3f;
memset(sum,0,sizeof(sum));
memset(vis,0,sizeof(vis));
for(int i=0;i>num[i];
c[i]=num[i];
table[c[i]]=i;
minnest=c[i]
poj 3270 更換使用
1.確定初始和目標狀態。明確。目標狀態的排序狀態。2.得出置換群,比如,數字是8 4 5 3 2 7 目標狀態是 2 3 4 5 7 8 能寫為兩個迴圈 8 2 7 4 3 5 3.觀察當中乙個迴圈,明顯地。要使交換代價最小,應該用迴圈裡面最小的數字2 去與另外的兩個數字。7與 8交換。這樣交換的代...
poj 放蘋果 C語言 遞迴)
原題鏈結 description 把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?用k表示 5,1,1和1,5,1 是同一種分法。input 第一行是測試資料的數目t 0 t 20 以下每行均包含二個整數m和n,以空格分開。1 m,n 10。output 對輸入的...
POJ 1321 C 棋盤問題
1.dfs逐行的搜尋,定義vis陣列記錄某一列上是否已經有棋子存在,每次行數加1迭代,最後別忘了搜尋完一行都沒有放棋子的情況 2.特別注意 輸入的時候用getchar讀入一行,然後存入字元陣列中 include include using namespace std int n int k int ...