演算法設計與最佳化之等價轉換

來源:互聯網
上載者:User

標籤:演算法最佳化   等價轉換   Gergovia酒的交易   

等價轉換與其說是一種演算法的設計方法,更不說是一種演算法思想。這種思想能有助於我們把複雜的問題簡單化,幫我們理清問題的思路,甚至能直接得出求解問題的方法。
下面通過一道具體的題目來像讀者介紹這種思想。
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;    }此篇部落格,希望讀者能對“等價轉換”的思想有所瞭解。由於小編水平有限,歡迎讀者指正。

演算法設計與最佳化之等價轉換

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.