Mr. Bender and Square

本文探讨了一个数字表格中点亮单元格以满足特定数量要求的问题。初始状态下只有一个单元格被点亮,随着时间推移,相邻的未点亮单元格也会被点亮。文章详细介绍了如何计算达到指定点亮单元格数所需的最短时间,并提供了完整的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Mr. Bender has a digital table of size n × n, each cell can be switched on or off. He wants the field to have at least c switched on squares. When this condition is fulfilled, Mr Bender will be happy.

We'll consider the table rows numbered from top to bottom from 1 to n, and the columns — numbered from left to right from 1 to n. Initially there is exactly one switched on cell with coordinates (x, y) (x is the row number, y is the column number), and all other cells are switched off. Then each second we switch on the cells that are off but have the side-adjacent cells that are on.

For a cell with coordinates (x, y) the side-adjacent cells are cells with coordinates (x - 1, y)(x + 1, y)(x, y - 1)(x, y + 1).

In how many seconds will Mr. Bender get happy?

Input

The first line contains four space-separated integers n, x, y, c(1 ≤ n, c ≤ 109; 1 ≤ x, y ≤ nc ≤ n2).

Output

In a single line print a single integer — the answer to the problem.

Sample Input

Input
6 4 3 1
Output
0
Input
9 3 8 10
Output
2

Hint

Initially the first test has one painted cell, so the answer is 0. In the second test all events will go as is shown on the figure. .





//这题就是先算总面积,再减去超出面积,再加上重叠面积。关键要注意细节。
#include<iostream>
using namespace std;
int main()
{
     long long x,n,y,c;
     cin>>n>>y>>x>>c;
     long long i,xr,xl,yu,yd,d;
     x--;y--;
     long now=0;
     for(i=1;now<c;i++)
     {
         now=i*i+(i-1)*(i-1);
         if(now<c)
         continue;
         i--;
         xr=x+i;
         xl=x-i;
         yu=y-i;
         yd=y+i;
         if(xl<0) now-=xl*xl;
         if(xr>n-1) now-=(xr-n+1)*(xr-n+1);
          if(yu<0)
          {
              now-=yu*yu;
              yu++;
              d-=yu;
              if(x+d>n-1)
                now+=(x+d-n+2)*(x+d-n+1)/2;
              if(x+yu<0)
                now+=(x-d)*(x-d-1)/2;
          }
          if(yd>n-1)
          {
               now-=(yd-n+1)*(yd-n+1);
               d=yd-n+1;
               d--;
               if(x+d>n-1) now+=(x+d-n+2)*(x+d-n+1)/2;
               if(x-d<0) now+=(x-d)*(x-d-1)/2;
          }
          i++;
     }
     cout<<i-2<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值