算法設計與優化之等價轉換

等價轉換與其說是一種算法的設計方法,更不說是一種算法思想。這種思想能有助於我們把複雜的問題簡單化,幫我們理清問題的思路,甚至能直接得出求解問題的方法。
下面通過一道具體的題目來像讀者介紹這種思想。
Gergovia酒的交易(Wine trading in Gergovia,UVa 11054)
直線上有n(2<=n<=100000)個等距離的村莊,每個村莊要麼買酒,要麼賣酒。設第i個村莊對酒的需求爲ai(-1000<=ai<=1000),其中ai>0表示要賣酒,反之表示要賣酒。所有村莊供需平衡,即所有的ai和爲0.把第K個單位的酒從一個村莊運到相鄰的村莊需要K個勞動力。請計算需要多少勞動力可以滿足所有村莊的需求。
當我們讀玩題目的時候似乎沒有什麼思路,覺得這麼多的村莊似乎無法下手。下面小編帶着讀者來理清這道題的思路。我們從最左邊的村莊開始考慮。如果它需要買酒,一定需要從村莊2往左運給它,而我們不需要考慮村莊2的酒是從哪裏來的。(但是,我們可想而知,肯定要麼是村莊2自己的酒,要麼是村莊2右邊的村莊運到村莊2的)。這樣問題就等價於只有村莊2~n,且第2個村莊的需求爲a1+a2。並且這個推理,不管ai<0,ai>0都是成立的。所以到這裏,這道題的題目就理清了,理清以後似乎這道題簡答了好多,代碼也變得好寫一些了。
代碼如下


int main(){
        int n;
        while(cin>>n&&n){
                long long ans=0,a,last=0;
                for(int i=0;i<n;i++){
                        cin>>ai;
                        ans+=abs(last);
                        last+=a;
                    }
                    cout<<ans<<"\n";
            }
                return 0;
    }
此篇博客,希望讀者能對“等價轉換”的思想有所瞭解。由於小編水平有限,歡迎讀者指正。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章