2018.10.20 2018NOIP衝刺之酒廠選址
ofollow,noindex">題目傳送門
明顯能夠看出有一個建圖求路程的優化 然而發現10000*10000爆空間QAQ
為了做一些初始化方面的優化 我們發現了一個叫做字首和的東西 可以在環上查到兩個之間的最短距離
同時還要做一些查詢代價方面的優化 比如由在城市1建廠推出在其它城市建廠的代價
(然而由於本人過於蒟蒻 所以不會)
那麼還有一種方法
其實本題難點就在於環上怎樣查詢代價
我們有這樣一個方法
把環展成兩部分 在下標分別為i以及i+n的兩個位置之間找到待查詢的值並找最小值
這樣思路就很明顯了
上程式碼
#include <iostream> #include <cstdio> #include <climits> using namespace std; const int M=10005; int n,m,dis,a,b; long long c; int d[M],z[M]; long long sum[M]; long long ans=LLONG_MAX; int main() { freopen("bro.in","r",stdin); freopen("bro.out","w",stdout); cin>>n; for(int i=1;i<=n;i++) { scanf("%d%d",&z[i],&d[i]); sum[i]=sum[i-1]+d[i]; } for(int i=1;i<=n;i++) { long long tot=0; for(int j=1;j<=n;j++) { a=max(i,j),b=min(i,j),c=sum[a]-sum[b-1]-d[a];//字首和 dis=min(c,sum[n]-c);//破環成鏈 tot+=dis*z[j]; } ans=min(ans,tot); } printf("%lld\n",ans); return 0; }