我試圖解決一個問題,其中包括尋找最低成本。這個問題可以表述爲:給定n建築物,併爲每個建築物的高度和成本給出。現在的任務是找到最低成本,使所有的建築物變成等於相同的高度。每棟建築物可以被認爲是垂直堆積的磚,其中每塊磚可以以與該建築物相關的成本來添加或去除。如何找到最低成本?
例如: 假設n = 3的建築物的高度分別爲1,2,3和10,100,1000。
這裏,最低的成本將等於120
這裏是鏈接的問題:
http://www.spoj.pl/problems/KOPC12A/
一個明顯的答案是要找到與每個高度相關的成本對於所有的建築物,然後給他們輸出最小的成本。這是O(n^2)。
爲了尋找更好的解決方案,我試着找到高度與成本比值最小值的高度。然後所有的建築物必須等於這個高度並計算成本並作爲輸出。但是這給了我錯誤的回答。 這裏是我的實現:
基於下面的答案我已經使用加權平均值更新了我的代碼,但仍然沒有working.It給了我錯誤的答案。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
long long fun(int h[],int c[],int optimal_h,int n){
long long res=0;
for(int i=0;i<n;i++){
res += (abs(h[i]-optimal_h))*c[i];
}
return res;
}
int main()
{
int t;
cin>>t;
for(int w=0;w<t;w++){
int n;
cin>>n;
int h[n];
int c[n];
int a[n];
int hh[n];
for(int i=0;i<n;i++){
cin>>h[i];
hh[i]=h[i];
}
sort(hh,hh+n);
for(int i=0;i<n;i++)
cin>>c[i];
long long w_sum=0;
long long cost=0;
for(int i=0;i<n;i++){
w_sum += h[i]*c[i];
cost += c[i];
}
int optimal_h;
if(cost!=0){
optimal_h=(int)((double)w_sum/cost + 0.5);
if(!binary_search(hh,hh+n,optimal_h)){
int idx=lower_bound(hh,hh+n,optimal_h)-hh;
int optimal_h1=hh[idx];
int optimal_h2=hh[idx-1];
long long res1=fun(h,c,optimal_h1,n);
long long res2=fun(h,c,optimal_h2,n);
if(res1<res2)
cout<<res1<<"\n";
else
cout<<res2<<"\n";
}
else{
long long res=fun(h,c,optimal_h,n);
cout<<res<<"\n";
}
}
else
cout<<"0\n";
}
return 0;
}
任何想法如何解決這個問題?
不要將其標記爲[C標記。 – ApprenticeHacker 2012-03-20 17:01:40
而@dark_shadow,請不要鏈接到您的代碼的外部網站。只要把它放在這裏,並正確格式化。 – 2012-03-20 17:02:32
小費,不知道它是否有用;計算建築物高度之間的加權平均值,其中權重是成本。 – 2012-03-20 17:08:49