Blocked Points CodeForces - 392A

原题链接
考察:枚举
思路:
  求出边界点的坐标,然后按公式计算.
  主要就是如何求边界点的坐标,如果两个坐标点嵌套\(for\)循环枚举,\(100\%\)超时.这里考虑是一个坐标从小枚举,另一个坐标从大开始枚举.

Code

#include <iostream> 
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
int n;
LL ans;
LL cal(int i,int j)
{
	return (LL)i*i+(LL)j*j;
}
int main()
{
	scanf("%d",&n);
	if(!n)
	{
		printf("1\n");
		return 0;
	}
	if(n==1)
	{
		printf("4\n");
		return 0;
	}
	int y,minv = n+10,x = 0;
	for(int i=0,j=n;i<=j;i++)
	{
		while(cal(i,j)>(LL)n*n) j--;
		if(i>j) break;
		if(j-i<minv) minv = j-i,x = i,y = j;
	}
	if(x==y) ans = (x-1)*8+8;
	else ans = min(x,y)*8+4;
	printf("%lld\n",ans);
	return 0;
}

posted @ 2021-09-19 09:34  acmloser  阅读(33)  评论(0编辑  收藏  举报