[DP] BZOJ2700 聚会

来源:互联网 发布:网络直播股票 编辑:程序博客网 时间:2024/05/01 06:08

%%%Hillan:http://blog.csdn.net/liutian429073576/article/details/50910334


我开始想的就是O(n) 贪心


#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>using namespace std;typedef long long ll;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++;}inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}int n,m;int cnt1,cnt2;int a[1005],b[1005];ll f[1005][1005][2][3];int main(){int _f,_c;freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(m); read(n);for (int i=1;i<=n;i++){read(_c); read(_f);_f?a[++cnt1]=_c:b[++cnt2]=_c;}while (cnt1<n) a[++cnt1]=1<<30;while (cnt2<n) b[++cnt2]=1<<30;sort(a+1,a+n+1); sort(b+1,b+n+1);memset(f,0x7f,sizeof(f));f[0][0][0][1]=f[0][0][0][2]=f[0][0][1][1]=f[0][0][1][2]=0;ll ac,bc;for (int i=1;i<=m;i++){for (int j=0;j<=i;j++){ac=(ll)a[j]*(m-i+1);bc=(ll)b[i-j]*(m-i+1);if (j>0) f[i][j][0][1]=min(f[i-1][j-1][1][1],f[i-1][j-1][1][2])+ac;if (j>1) f[i][j][0][2]=f[i-1][j-1][0][1]+ac;if (i-j>0)f[i][j][1][1]=min(f[i-1][j][0][1],f[i-1][j][0][2])+bc;if (i-j>1)f[i][j][1][2]=f[i-1][j][1][1]+bc;}}ll ans=1LL<<60;for (int j=0;j<=m;j++){ans=min(ans,f[m][j][0][1]);ans=min(ans,f[m][j][0][2]);ans=min(ans,f[m][j][1][1]);ans=min(ans,f[m][j][1][2]);}printf("%lld\n",ans);return 0;}


0 0