记录编号 |
589215 |
评测结果 |
AAAAAAAAAAAAAEEEEETA |
题目名称 |
挑战 NPH |
最终得分 |
70 |
用户昵称 |
flyfree |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
7.355 s |
提交时间 |
2024-07-03 18:00:40 |
内存使用 |
61.53 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int T;
ll w[1005],n,k,s;
ll w1,w2;
ll bag[10000005];
int ef(){
ll l=1,r=(w1+w2)*sqrt(k);
while(l<r){
ll mid=(l+r)/2;
ll ans=0;
for(ll i=0;i<=(mid/w1);i++){
ans+=(mid-i*w1)/w2+1;
}
ans-=1;
if(ans>=k)r=mid;
else l=mid+1;
}
return l;
}
int main(){
freopen("NPH.in","r",stdin);
freopen("NPH.out","w",stdout);
cin>>T;
for(ll tm=1;tm<=T;tm++){
cin>>n>>k;
if(n==1){
ll x;
cin>>x;
cout<<x*k<<endl;
}else if(n==2){
cin>>w1>>w2;
if(w1<w2)swap(w1,w2);
cout<<ef()<<endl;
}else{
// memset(bag,0,sizeof(bag));
bag[0]=1;
for(int i=1;i<=n;i++){
cin>>w[i];
s+=w[i];
}
int len=pow(k,(1.0)/(double)n)*s;
for(int i=1;i<=n;i++)for(int j=w[i];j<=len;j++){
bag[j]+=bag[j-w[i]];
}
ll ans=0;
while(k>0){
ans++;
k-=bag[ans];
// cout<<bag[ans]<<endl;
}
cout<<ans<<endl;
for(int j=0;j<=len;j++)bag[j]=0;
}
}
return 0;
}