数学、构造

若 $P$ 不为整数,那么必然存在一组仅使用 $\lfloor P \rfloor$ 和 $\lceil P \rceil$ 且使用数字数量最小的方案。

使用其他数字的最优方案中其他数字可以被等价转换为 $\lfloor P \rfloor$ 和 $\lceil P \rceil$ 的组合。

证明:假设给定的 $P \in [2,3]$,此时 $\lfloor P \rfloor=2,\lceil P \rceil=3$,将选择的数两两配对后考虑对答案的影响。

12345
1$1$$1.5$$2$$2.5$$3$
2$1.5$$2$$2.5$$3$$3.5$
3$2$$2.5$$3$$3.5$$4$
4$2.5$$3$$3.5$$4$$4.5$
5$3$$3.5$$4$$4.5$$5$

可以发现只需要 $2$ 和 $3$ 的组合就能凑出 $[2,3]$ 区间内的任意数字,其他数对要么和 $2,3$ 组合出的数对等价,要么显然更劣。所以必定存在选择了不超过一个 $2,3$ 之外的数字的最优方案

再证明包含一个 $2,3$ 之外的数字的最优方案中该数字可以被替换,假设一个最优方案中包含一个 $1$,那么这个方案必定也包含至少一个 $3$,否则能够推出 $P \in [1,2)$,与给定条件矛盾。由上表可知 $1,3$ 等价于 $2,2$,最优方案中包含一个 $4$ 的情况同理。最优方案中不会仅包含一个 $5$,因为 $2,5$ 和 $3,5$ 都是会使答案变劣的组合。

给定的 $P$ 在其他区间内的情况同理,证毕。

令 $x=P - \lfloor P \rfloor$,问题转化为找到一组和最小且满足 $\dfrac{0 \times k_1 + 1 \times k_2}{k_1+k_2}=x$ 的整数 $k_1,k_2$,构造的最优方案中仅使用 $k_1$ 个 $\lfloor P \rfloor$ 和 $k_2$ 个 $\lceil P \rceil$。

移项得 $\dfrac{k_1}{k_2}=\dfrac{1-x}{x}$,令 $y=1-x$,将 $x$ 和 $y$ 同乘 $10$ 的幂转化为整数后同时除以 $\gcd(x,y)$ 可以得到 $k_1,k_2$ 的值。

#include<bits/stdc++.h>
using namespace std;
int pos,lim,ans[8];
string s;
int main(){
    cin>>s,pos=s.find('.'),lim=s.size()-1;
    for(int i=pos+1;i<=lim;i++) if(s[i]!='0') goto conditionII;
    ans[s[0]-'0']=1;
    for(int i=1;i<=5;i++) cout<<ans[i]<<' ';
    return 0;
    conditionII:
    long long n=0ll,m=1ll;
    for(int i=pos+1;i<=lim;i++) m*=10,n=n*10+s[i]-'0';
    m-=n,ans[s[0]-'0'+1]=n/__gcd(n,m),ans[s[0]-'0']=m/__gcd(n,m);
    for(int i=1;i<=5;i++) cout<<ans[i]<<' ';
    return 0;
}
最后修改:2024 年 06 月 23 日
如果觉得我的文章对你有用,请随意赞赏