JZOJ 5386. 【NOIP2017提高A组模拟9.23】碎
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 5386. 【NOIP2017提高A组模拟9.23】碎
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
Input
Output
Sample Input
5
4 5 0 2
1 3 7
2 0
4
Sample Output
4
Data Constraint
Solution
這題真是一道“神神奇奇”的暴力題,我的做法理論時間復雜度 O(2N),N≤300 。
你一定會驚訝,這都能過?沒錯,神奇的優化能使程序跑得飛快!
設遞歸到第 x 種心塊,兩瓣心的陌生度分別為 v1,v2 ,當前最優答案為 ans 。
那么顯然有優化①:當 v1+v2>=ans 時退出(因為之后答案只會更大,不會更優了)。
其實對于遞歸心塊的順序,應該產生陌生度越多的越先加入,因為更快執行優化①,剪枝很多。
-于是我們對于加入的邊的大小從大到小排一遍序,使較大邊的兩端點先加入——優化②。
- 這樣結合優化①和優化②,在隨機數據下表現優良,實測 20ms ,秒過本題。
Code
#include<cstdio> #include<algorithm> using namespace std; const int N=301; struct data {int x,y,z; }a[N*N]; int n,tot,ans=2e9; int f[N],g[N],h[N],d[N][N]; bool bz[N]; inline int read() {int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w; } inline bool cmp(data x,data y) {return x.z>y.z; } inline int max(int x,int y) {return x>y?x:y; } inline void dfs(int x,int v1,int v2) {if(v1+v2>=ans) return;if(x>n){ans=v1+v2;return;}int mx=v1;for(int i=1;i<=f[0];i++) mx=max(mx,d[f[i]][h[x]]);f[++f[0]]=h[x];dfs(x+1,mx,v2);f[f[0]--]=0;mx=v2;for(int i=1;i<=g[0];i++) mx=max(mx,d[g[i]][h[x]]);g[++g[0]]=h[x];dfs(x+1,v1,mx);g[g[0]--]=0; } int main() {n=read();for(int i=1;i<=n;i++)for(int j=1;j<=n-i;j++){d[i][i+j]=d[i+j][i]=a[++tot].z=read();a[tot].x=i,a[tot].y=i+j;}sort(a+1,a+1+tot,cmp);for(int i=1;i<=tot;i++){if(!bz[a[i].x]) bz[h[++h[0]]=a[i].x]=true;if(!bz[a[i].y]) bz[h[++h[0]]=a[i].y]=true;}dfs(1,0,0);printf("%d",ans);return 0; }總結
以上是生活随笔為你收集整理的JZOJ 5386. 【NOIP2017提高A组模拟9.23】碎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5385. 【NOIP2017
- 下一篇: JZOJ 5379. 【NOIP2017