ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

思维题+贪心——牛客多校第一场C

2019-07-30 21:57:32  阅读:190  来源: 互联网

标签:... idx ai 多校 a1 牛客 int las 贪心


/*
给定一组n维向量 A=(a1/m,a2/m,a3/m ... an/m),
求另一个n维向量 P=(p1,p2,p3...pn),满足sum{pi}=1,使得ans=sum{(ai/m-pi)^2}最大化
并求出这个ans

首先将ai放大m倍 A=(a1,a2,a3...an)
同理 P=(p1,p2,p3...pn),sum{pi}=m
将ai按照降序排序,可以推出大的数减掉x一定比小的数减掉x更优
    (ai^2-(ai-x)^2)-(aj^2-(aj-x)^2)
    =2*x*ai-x^2-(2*x*xj-x^2)
    =2*x*(ai-aj)>0 
可以将原问题转化为从a[]数组里减去总和为m的数,使得最后a[]的平方和最小 
那么我们按照贪心策略进行减法,首先将a1减成a1==a2,然后再将a1a2减成a1==a2==a3,依次类推,直到m不够用 

最后答案就是减法完成后的a[]的平方和,并在除以m*m即可 
*/
while(~scanf("%d%d", &n, &m)) {
        for(int i = 1; i <= n; ++i) {
            scanf("%d", &a[i]);
        }
        sort(a + 1, a + n + 1, [](int a, int b){return a > b;});
        int idx = n;
        int las = m;
        for(int i = 1; i < n; ++i) {
            if(i * abs(a[i+1] - a[i]) > las) {
                idx = i;
                break;
            } else {
                las -= i * abs(a[i+1] - a[i]);
            }
        }
        LL num1 = 1LL * (idx * a[idx] - las) * (idx * a[idx] - las);
        LL num2 = 1LL * idx * m * m;
        for(int i = idx + 1; i <= n; ++i) {
            num1 += 1LL * a[i] * a[i] * idx;
        }
        LL tmp = __gcd(num1, num2);
        num1 /= tmp, num2 /= tmp;
        if(num2 == 1) printf("%lld\n", num1);
        else printf("%lld/%lld\n", num1, num2);
    }

 

标签:...,idx,ai,多校,a1,牛客,int,las,贪心
来源: https://www.cnblogs.com/zsben991126/p/11272986.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有