39 pts 求条
查看原帖
39 pts 求条
830990
roumeideclown楼主2025/1/8 16:31

record

玄关。

#include<bits/stdc++.h>
// #pragma G++ optimize(2)
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pii=pair<int,int>;
#define fi first
#define se second
constexpr int N=35,M=5005;
int sum[N],pos[N][M],ans[N];
ll dp[N][M];
struct data {
	int id,val;
	bool operator> (const data &B) const {
		return val>B.val;
	}
} a[N];
void work(int x,int y) {
	if(!x) return;
	for(int i=1;i<=x;i++) ans[i]++;
	work(pos[x][y],y-x);
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++) {cin>>a[i].val;a[i].id=i;}
	sort(a+1,a+n+1,greater<data>());
	for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i].val;
	memset(dp,0x3f,sizeof(dp));dp[0][0]=0;
	for(int i=1;i<=n;i++)
		for(int j=i;j<=m;j++)
			for(int k=0;k<=i;k++) {
				int tmp=dp[k][j-i]+k*(sum[i]-sum[k]);
				if(tmp<dp[i][j]) {dp[i][j]=tmp;pos[i][j]=k;}
			}
	cout<<dp[n][m]<<"\n";
	work(n,m);
	for(int i=1;i<=n;i++) cout<<ans[a[i].id]<<" ";cout<<"\n";
	return 0;
}
2025/1/8 16:31
加载中...