提交时间:2024-01-11 12:41:39

运行 ID: 24628

//10:30 12pt //10:40 20pt #include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=100010,N=110,Mod=1000000007,ie18=1000000000000000000; int n,k,ans,a[MAXN],b[MAXN],acs[MAXN];bool A=1; struct node{ int id,x; }s[MAXN]; bool cmp(node x,node y){return x.x<y.x;} set<int>st; int check(){ int rt=0; st.clear(); for(int i=1;i<=k;i++)st.insert(acs[i]); for(int i=1;i<=n;i++){ auto it=st.lower_bound(s[i].id); if(it!=st.end()){ rt+=s[i].x; st.erase(*it); } } return (st.empty())?rt:ie18; } void dfs(int now,int sum,int num){ if(num>=ans)return; if(sum==k+1){ ans=min(ans,check()+num); return; } if(now==n+1)return; dfs(now+1,sum,num); acs[sum]=now; dfs(now+1,sum+1,num+b[now]); } signed main(){ans=ie18; scanf("%lld%lld",&n,&k); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); s[i]={i,a[i]}; } sort(s+1,s+n+1,cmp); for(int i=1;i<=n;i++){ scanf("%lld",&b[i]); if(b[i]>b[i-1])A=0; } if(k>n){ printf("%lld",ie18); return 0; } if(A){ for(int i=1;i<=n;i++){ a[i]+=b[i]; } sort(a+1,a+n+1); for(int i=1;i<=k;i++){ ans+=a[i]; } printf("%lld",(k<=n)?ans:ie18); return 0; } dfs(1,1,0); printf("%lld",ans); return 0; }