任何疑问、意见、建议请留言公众号:一航代码
在太平洋的一个小岛上,岛民想要建立一个环岛的堤坝,我们可以将小岛简化为一个二维平面,你需要使用K条边(这些边要么是水平或者垂直长度为1的边,要么是倾斜45度的长度为根号2的边)围城一个多边形,多边形的顶点必须位于整点,然后要让围成的多边形面积最大,你需要求出最大面积是多少。
输入格式:
输入的数据有多组,每组数据给出一个数K(3≤K≤2,000,000,000)。
输出格式:
每一组对应一个要求的答案(保留一位小数)。
输入样例:
3 4 5 6
输出样例:
0.5 2.0 2.5 4.0
解决方法:
(1)算法思想:
数学题,找规律。太难。
-
这道题的OJ,时间卡的很死。输入最好用scanf,不能用cin。
并且最后计算出s以后不能用double变量保存s*0.5,然后输出,也会超时(存疑)。
OJ提交地址:
http://www.pipioj.online/problem.php?id=1013
-
规律非常难找。
大致规律:
①组成的图形都是由小三角形构成,每个小三角形的面积是0.5,需要寻找K和小三角形数量之间的关系。
②用K去除以4,这里的4,可以看做每4个三角形组成一个小正方形,组成整数个小正方形后,多余的小三角形个数,以10103030来循环。
③K或者s为奇数时,面积存在 .5。K为偶数时,面积为整数。
(2)代码实现:
#include <iostream>
using namespace std;
//@一航代码
int main()
{
long long k, s = 0, r, c;
while (scanf("%lld", &k) != EOF)//不可用cin会超时
{
r = k / 4;
c = k % 4;
if (c == 0)
{
s = 4 * r * r;
}
else if (c == 1)
{
s = 4 * r * r + 2 * r - 1;
}
else if (c == 2)
{
// s = 4 * r * r + 2 * r - 1 + 2 * r + 1;
s = 4 * r * r + 4 * r;
}
else if (c == 3)
{
// s = 4 * r * r + 2 * r - 1 + 2 * r + 1 + 2 * r + 1;
s = 4 * r * r + 6 * r + 1;
}
if (k % 2 == 0)
{
printf("%lld.0\n", s / 2);//单独拿出来乘0.5会超时(存疑)
}else{
printf("%lld.5\n", s / 2);
}
}
return 0;
}