Don't fake it till you made it

Fake it till you become it

Hackerrank Hard Homework

题目链接:
https://www.hackerrank.com/contests/w26/challenges/hard-homework
题目大意:
给定n 求正整数x,y,z满足x+y+z=n 最大化sin(x)+sin(y)+sin(z)

一开始往死里搞没拆出来.. 搞了一个O(nlogn)的做法结果死都没有卡过去..

后来重新推了一遍式子发现居然可以O(n)
sin(x)+sin(y)+sin(z)
12
=sin(x+y2+xy2)+sin(x+y2xy2)+sin(nxy)
=2sin(x+y2)cos(xy2)+sin(n)cos(x+y)cos(n)sin(x+y)
枚举x+y发现
每次x+y增加2时 xy2 只增加一个额外值
按x+y的奇偶性做

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    double ans=-1e9;
    double mx=-1e9,mn=1e9;
    for(int i=2;i<n;i+=2)
    {
        mx=max(mx,cos((i-2)/2));
        mn=min(mn,cos((i-2)/2));
        ans=max(ans,2.*sin(i/2)*mx+sin(n-i));
        ans=max(ans,2.*sin(i/2)*mn+sin(n-i));
    }
    mx=-1e9,mn=1e9;
    for(int i=3;i<n;i+=2)
    {
        mx=max(mx,cos((i-2.0)/2));
        mn=min(mn,cos((i-2.0)/2));
        ans=max(ans,2.*sin(i/2.0)*mx+sin(n-i));
        ans=max(ans,2.*sin(i/2.0)*mn+sin(n-i));
    }
    printf("%.9f\n",ans);
    return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liutian429073576/article/details/53586363
个人分类: 数学
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Hackerrank Hard Homework

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭