1 条题解

  • 1
    @ 2023-10-15 19:46:15

    题目简化

    构造一个长度为 nn 的数组。

    其和不大于 yy,且每个数的平方的和不小于 xx

    可简化成一下公式:

    公式 A

    i=1naiy\sum_{i=1}^{n}a_i \le y

    公式 B

    i=1nai2x\sum_{i=1}^{n}a_i^2 \ge x

    题目思路

    显然,巨大的数据量让此题只能 O(n)O(n) 解决。

    那么,构造组数要 O(n)O(n) 解决只能贪心。

    设想以下样例的不同解法:

    输入

    5 15 15
    

    输出 A

    1 1 1 1 11
    

    输出 B

    2 2 2 2 7
    

    输出 C

    1 1 1 6 6
    

    可以自己思考一下哪个输出在公式 B 的情况下答案最大呢。

    首先想要让输出更有机会满足公式 B 就必须让输出最大化。

    显然,我们肯定会让以下公式成立,才可以更大化答案。

    i=1nai=y\sum_{i=1}^{n}a_i = y

    解释

    假设有一组输出满足以下公式:

    i=1nai=y1\sum_{i=1}^{n}a_i = y-1

    那么我们会发现如果但凡把其中一个数加 11,使数据满足以下公式,此输出一定更有可能满足公式 B

    i=1nai=y\sum_{i=1}^{n}a_i = y

    最大化答案(接解释)

    那么,怎么让一组数据在公式 B 的答案最大呢?

    我们可以举个例子:

    例子 A

    1 3 5
    

    例子 B

    1 1 7
    

    我们发现,我们只需要最大化其中一个数,将其他数最小化即可完成题目。

    综上所述,我们按照例子 B 的方法构造数据,如果可行,直接输出,否则输出 1-1

    题目代码

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	long long n,x,y;
    	cin>>n>>x>>y;
    	if((y-n+1)*(y-n+1)+(n-1)>=x && y>=n)
    	{
    		for(long long i=1;i<n;i++)cout<<1<<endl;
    		cout<<y-n+1<<endl;
    		return 0;
    	}
    	cout<<-1; 
    }
    

    数学证明

    已知在 a+b=na+b=n 的情况下满足 a2+b212+(n1)2a^2+b^2\le1^2+(n-1)^2

    解:设 c+d=ac+d=a

    a2+b212+(n1)2∵a^2+b^2\le1^2+(n-1)^2

    b2+c2+d212+12+(n2)2∴b^2+c^2+d^2\le1^2+1^2+(n-2)^2

    $∴\forall_{1,n}\ a_i^2\le \forall_{1,n-1}1^2\ +(y-n+1)^2$

    综上所述,最贪心的方法是 1,n112 +(yn+1)2\forall_{1,n-1}1^2\ +(y-n+1)^2

    • 1

    信息

    ID
    8240
    时间
    2000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    1
    已通过
    1
    上传者