2017.10.11 T1 1967
样例数据
输入
5
1
2
3
4
5
输出
4
4
6
6
7
分析:一道找规律,那50%的数据是给勤快的手算的同学的。其实我一直都没有找到规律,直到出题人神犇wuvin(金牌膜膜膜)看不下去我们这群蒟蒻乱算给出了面积为5的画法:
我突然找到了规律!!!
当木板数为4n时,显然是这样:
当木板数为4n+1时,就是加一个梯形:
当木板数为4n+2时,就是加一个矩形(因为再加一个梯形[右下那个]没他大,如图,还多了左上右下两个小三角形):
当木板数为4n+3时,就是在矩形的基础上在较长边上加一个梯形(这个就不需要证为什么不是短边了吧):
然后此题就完事了。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
#include<queue>
#include<set>
using namespace std;
int getint()
{
int sum=0,f=1;
char ch;
for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());
if(ch=='-')
{
f=-1;
ch=getchar();
}
for(;isdigit(ch);ch=getchar())
sum=(sum<<3)+(sum<<1)+ch-48;
return sum*f;
}
int T,k;
int s[92010];//因为询问是整数,所以省去了小数是没问题的
int main()
{
freopen("area.in","r",stdin);
freopen("area.out","w",stdout);
s[4]=2;
for(int i=5;i<=92000;++i)//预处理
{
if(i%4==0)
s[i]=(i/4)*(i/4)*2;
if(i%4==1)
s[i]=s[i-1]+((i-1)/4+(i-1)/4-1)/2;
if(i%4==2)
s[i]=s[i-2]+(i-2)/2;
if(i%4==3)
s[i]=s[i-1]+((i-3)/4+1+(i-3)/4)/2;
}
T=getint();
while(T--)//直接查询
{
k=getint();
for(int i=4;i<=92000;++i)
if(s[i]>=k)
{
cout<<i<<'\n';
break;
}
}
return 0;
}
本题结。