提交时间:2026-05-27 14:53:00

运行 ID: 41679

#include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back bool AAA; const int MAXN=310,N=17,M=100;const ll inf=1e18; int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} int n,k,m,a[MAXN];ll ans; int p[MAXN],ls[MAXN]; struct node{ int i,ls; vector<int>P; bool operator==(const node&G)const{ return P==G.P&&i==G.i&&ls==G.ls; } }; queue<node>Q; struct Hsh{ ull operator()(const node&G)const{ ull res=G.ls*n+G.i; for(auto o:G.P)res=res*n+o; return res; } }; unordered_map<node,ll,Hsh>f; void DP(node x,ll y){ if(!f.count(x))f[x]=y,Q.push(x); else f[x]=min(f[x],y); } void slv(){ n=read(),k=read(),m=n/k; if(n==k){puts("0");return;} for(int i=1;i<=n;i++)a[i]=read(); sort(a+1,a+n+1); Q.push({0,0,{}}); ans=inf; while(!Q.empty()){ node now=Q.front();Q.pop(); int i=now.i+1,ls=now.ls; if(i==n+1){ans=min(ans,f[now]);continue;} vector<int>P=now.P; // cout<<"i:"<<i<<" "<<ls<<" "; // for(auto o:P)cout<<o<<",";cout<<endl; ll val=f[now]; for(int o=0;o<P.size();o++)if((a[i]!=a[i-1]||P[o]<=ls)&&P[o]<m&&(!o||P[o-1]>P[o])){ if(P[o]==m-1)val+=a[i]; P[o]++; DP((node){i,P[o]-1,P},val); P[o]--; if(P[o]==m-1)val-=a[i]; } if(P.size()<k){ P.pb({1}); DP((node){i,0,P},val-a[i]); } } if(ans==inf)ans=-1; printf("%lld",ans); } bool BBB; signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; // cerr<<((&AAA)-(&BBB))/1024.0/1024<<"MB\n"; return 0; }