玲珑杯round17 A题-CSDN博客

67 阅读1分钟

A sin your life

计算sin(x) + sin(y) + sin(y)的最大值,约束条件: x + y + z = n, 3 <= n <= 3000000,输入只有一个n,输出最值(保留9位小数)。

首先: sin(x) + sin(y) = 2 * sin((x + y)/2) * cos((x - y)/2) 和差化积公式

然后看这里:sin(x) + sin(y) + sin(y) = 2 * sin((x + y)/2) * cos((x - y)/2) + sin(n - x - y),,,,化简到这,若还不知道怎么做,就摸摸头,直接枚举 x + y的值(增量为2),把它看成一个整体,啥⊙∀⊙?那cos(x -y)怎么办?笨呀,x + y的值知道了,那么(x, y)肯定就是有多种组合呀,让x = y不就可以啦,这样cos(x -y)就是 1了(余弦中的最大值);若x + y为奇数怎么办呢,这个我没法证明。。。。(有时候也得相信玄学,冥冥之中,自由道理,反对不可知论)

所以说,时间复杂度O(N)。

\

#include <stdio.h> 
#include <math.h>
#define max(A, B) ((A) > (B) ? (A) : (B))
int main()
{
	int n;
	while(~scanf("%d", &n)) {
		double ans = -3.0;
		for (int i = 2; i <= n; i += 2) {
			ans = max(ans, 2.0 * sin(i / 2.0) + sin(n - i));
		}
		printf("%.9f\n", ans);
	}
	
	return 0;
}


这道题可以用微积分知识解,拉格朗日乘数法,不过我已经学完微积分一年了,忘差不多了,有时间再补,考研时肯定得把数学补回来。\