Codeforces Round #317 [AimFund Thanks-Round] (Div. 1) B
2015-08-24 23:22
567 查看
B Minimization
给一个数列,任意安排顺序,让所有下标距离为k的两个元素作差,取绝对值,全部加起来,问和最小是多少。
分析一下就能知道,根据下标取模得数的不同,可以把这些数分为k组。在最优解情况下,每一组可以让里面的数单调,并且不同组之间也单调,然后就是dp了。比赛的时候想了好久没想清楚怎么dp,功力尚浅啊。。因为我总想着用元素的下标表示状态。。。其实,k组数里面,有n%k个大组,k-(n%k)个小组,大组比小组多一个数,组数最多为5000。只需要用大组和小组各有多少个来表示状态即可。解题难点在于巧妙表示状态!
给一个数列,任意安排顺序,让所有下标距离为k的两个元素作差,取绝对值,全部加起来,问和最小是多少。
分析一下就能知道,根据下标取模得数的不同,可以把这些数分为k组。在最优解情况下,每一组可以让里面的数单调,并且不同组之间也单调,然后就是dp了。比赛的时候想了好久没想清楚怎么dp,功力尚浅啊。。因为我总想着用元素的下标表示状态。。。其实,k组数里面,有n%k个大组,k-(n%k)个小组,大组比小组多一个数,组数最多为5000。只需要用大组和小组各有多少个来表示状态即可。解题难点在于巧妙表示状态!
#include<bits/stdc++.h> using namespace std; #define ll long long const ll INF = 1000000000000000LL; int a[300010]; ll dp[5010][5010]; int main(){ int n,k; cin>>n>>k; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } sort(a,a+n); int gsize = n/k; int l = n%k; int s = k-l; for(int i=0;i<=k;i++){ for(int j=0;j<=min(s,i);j++){ dp[j][i-j]=INF; } } ll ans=INF; dp[0][0]=0; for(int i=1;i<=k;i++){ for(int j=0;j<=min(s,i);j++){ //small:j,large:i-j; int pos = i*gsize+(i-j)-1; if(j>0)dp[j][i-j]=min(dp[j][i-j],dp[j-1][i-j]+a[pos]-a[pos-gsize+1]); if(i-j>0)dp[j][i-j]=min(dp[j][i-j],dp[j][i-j-1]+a[pos]-a[pos-gsize]); if(i==k&&s==j){ ans=min(ans,dp[j][k-j]); } } } cout<<ans<<endl; return 0; }
相关文章推荐
- 为什么Android每当启动一个新的应用程序时会通过“throw new ZygoteInit.MethodAndArgsCaller(m, argv)”进入ActivityThread的main函数
- Run-Time Check Failure #2 - Stack around the variable 'myTrackbarName' was corrupted.
- 【Linux学习】epoll详解 http://blog.csdn.net/xiajun07061225/article/details/9250579
- Factorial Trailing Zeroes
- HDU 4300 Clairewd’s message(KMP)
- KMP HDOJ 4300 Clairewd's message
- Failed to install metadata only whitespace content allowed before start tag and not \u0
- HDU2389 Rain on your Parade(二分图匹配 ,HK算法 )
- Aizu - 2306 Rabbit Party (DFS图论)
- 文本文件查看命令:cat, tac, more, less, tail, head
- POJ1273——最大流之Edmonds-Karp——Drainage Ditches
- Aizu - 2305 Beautiful Currency (二分 + DFS遍历)
- svn cleanup failed 解决办法
- poj 1995 Raising Modulo Numbers 【快速幂】
- hdu1532 Drainage Ditches
- hdu 1702 ACboy needs your help again!
- 1090. Highest Price in Supply Chain (25) -计层的BFS改进
- 1090. Highest Price in Supply Chain (25) -计层的BFS改进
- POJ2010--Moo University-Financial Aid(优先队列)
- Codeforces Round #317 [AimFund Thanks-Round] (Div. 1)(组合数学+容斥)