1 题意。
看了好一会儿,才看懂。。给出木柴棒的个数,求最高搭几层。
2 分析。
找规律做的,赛后发现别人用的预处理+二分。学习了。
3
a.预处理+二分 ,也很快、100ms+
#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int t;
ll n;
ll a[maxn]={0,1},b[maxn];
void Ini(){
a[0]=0;
a[1]=3;
for(int i=2;i<maxn;i++){
a[i]=a[i-1]+2;
}
for(int i=2;i<maxn;i++){
a[i]+=a[i-1];
}
}
int main()
{
Ini();
scanf("%d",&t);
for(int kk=1;kk<=t;kk++){
scanf("%lld",&n);
int l=0,r=maxn,mid;
while(l<=r){
mid=(l+r)>>1;
if(a[mid]<n){
l=mid+1;
}
else if(a[mid]>n){
r=mid-1;
}
else if(a[mid]==n){
l=mid;
break;
}
}
printf("Case %d: %d\n",kk,min(l,r));
}
}
b.找规律 , 80ms
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
int kase;
long long n,res;
int main()
{
scanf("%d",&kase);
for(int kk=1;kk<=kase;kk++){
scanf("%lld",&n);
res=(-2+(long long)sqrt(4+4*n))/(long long)2;
printf("Case %d: %lld\n",kk,res);
}
}