[OOI2023] n 维巧克力问题 题解
其实是数论基础题。
考虑状态的设计:
发现对于某一些
实现时注意到
放代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n,k; cin>>n>>k,k--;
vector<int> a(n),w;
for(auto &i:a)cin>>i;
for(int l=1,r;l<=k;l=r+1)
w.emplace_back(k/l),r=k/(k/l);
w.emplace_back(0); // 预处理第二维的可能值
vector<int> p(k+1,-1);
for(int i=0;i<w.size();i++)
p[w[i]]=i; // 记一下位置方便转移时快速查找
vector<double> f(w.size());
f[0]=k+1;
for(int x:a){
vector<double> g(w.size());
for(int i=0;i<w.size();i++)
if(f[i]){
for(int l=1,r;l<=w[i];l=r+1){
int v=w[i]/l;
g[p[v]]=max(g[p[v]],f[i]*(x/l)/x),r=w[i]/v;
} // 整除分块进行转移
g.back()=max(g.back(),f[i]*(x/(w[i]+1))/x);
// 特判值为 0
}
f=move(g); // 使用滚动数组
}
cout<<fixed<<setprecision(11)<<f.back()<<endl;
return 0;
}