[YZOJ1579]&&[BZOJ2450]arr

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   os   

Description

  給出3*n個數xi,要求構造三個長度為n的序列ai,bi,ci,使得滿足下列條件:

    1到3*n的每個數都在三個序列中的某個出現一次且僅一次;

    S=sum((x[ai]-x[bi])*x[ci])最大。

  輸出最大的S。多組資料。

Input Format

  第一行包含兩個數T和n,T是資料群組數,n如題目描述。

  接下來T行,每行包含3*n個數,表示xi。

Output Format

  輸出包含T行,每行輸出最大的S。

Sample Input
1 24 1 8 2 0 5
Sample Output
46
Hint

  對於1<=n<=10,有不超過1000組資料;

  對於11<=n<=15,又不超過100組資料;

  對於16<=n<=20,有不超過10組資料;

  對於21<=n<=25,僅有1組資料。

  所有xi<=1000。

 

Solution

  首先先Orz yff,怎麼想到dfs的。。。標解是狀壓DP,還是卡時過的,不知比暴力慢到哪裡去了。

  1. 當a>=c>=b時(a-b)*c的值最大。推一推就出來了。

  2. 將讀入的3*n個數從小到大排序,x1~xn一定分別在每組中,且一定是每組的b

  3. 將n個三元組(ai,bi,ci)按照ci從小到大排序。為了使Σ( a[i] - b[i] ) * c[i]最大化,根據排序不等式可以得a1<=a2<=a3<=…<=an,b1>=b2>=…>=bn。所以b1=xn,b2=xn-1…bn=x1。

  4. 最優性剪枝:兩個三元組(ai,bi,ci)與(aj,bj,cj)為最終答案,若且唯若

    (ai - bi) * ci + (aj - bj) * cj > (ai - bi) * aj + (ci - bj) * cj

    即(ci - aj) (ai - bi - cj) > 0

  然後就dfs吧= =

 

 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 int T,n,a[30],c[30],t[100],ans,now;bool vis[100]; 5 bool check(int x) 6 { 7     for(int i=1;i<x;i++) 8     { 9         if(c[i]>a[x]&&a[i]-t[3*n-i+1]<c[x])return 0;10         if(c[i]<a[x]&&a[i]-t[3*n-i+1]>c[x])return 0;11     }12     return 1;13 }14 void dfs(int xa,int tc)15 {16     if(xa==n+1)17     {18         if(ans<now)ans=now;19         return;20     }21     for(int i=xa;i<=2*n;i++)22     if(!vis[i])23     {24         vis[i]=1,a[xa]=t[i];25         for(int j=std::max(i,tc)+1;j<=2*n;j++)26         if(!vis[j])27         {28             vis[j]=1,c[xa]=t[j],29             now+=(a[xa]-t[3*n-xa+1])*c[xa];30             if(now*n>ans*xa&&check(xa))dfs(xa+1,j);31             now-=(a[xa]-t[3*n-xa+1])*c[xa],vis[j]=0;32         }33         vis[i]=0;break;34     }35 }36 bool cmp(int i,int j){return i>j;}37 int main()38 {39     for(scanf("%d%d",&T,&n);T;T--)40     {41         for(int i=1;i<=3*n;i++)scanf("%d",&t[i]);42         std::sort(t+1,t+1+3*n,cmp);ans=0;43         dfs(1,0);printf("%d\n",ans);44     }45 }
View Code

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.