2023牛客寒假算法基础集训营3(b)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

小红希望用恰好n块矩形积木来搭建正方形,其中小红可以自由选择每块积木的大小,但必须是1∗k的长和宽。其中1≤k≤⌈n2⌉。小红想知道,自己最大可以搭建多大的正方形?请你帮小红计算正方形的边长。如果无法用恰好n块矩形拼成正方形,请输出-1。

输入描述:

第一行输入一个正整数t,代表询问的次数。
接下来的t行,每行输入一个正整数n,代表一次查询。
1≤t≤200000
1≤n≤1018

输出描述:

输出t行,每行输入一个正整数,代表可以拼成的正方形最大边长。

示例1

输入

3
2
4
6

输出

-1
2
4

说明

 
 

n=2时,只能使用1*1的积木,显然恰好两个积木无法拼成任何正方形。

n=4时,2*2正方形的拼法(4个1*1即可):

n=6时,4*4正方形的拼法:

 

第一种做法,推公式

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[]={0,0,1,2,3,3};


int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    ll t;
    cin>>t;
    while(t--){
        ll n;
        cin>>n;
        if(n==1){
            cout<<1<<endl;
        }
        else if(n==2)cout<<-1<<endl;
        else{
            ll ans = (n-3)/6*4+2+a[(n-3)%6];
            cout<<ans<<endl;
        }
    }


//    std::ios::sync_with_stdio(false);
//    std::cin.tie(0);



    return 0;

}

 

第二种,二分 

#include <iostream>

using namespace std;
typedef long long ll;
ll n;
int t;
bool check(ll mid){
    if((mid*3-((n+1)/2)*2)<=n) {
        return true;
    }
    return false;
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%lld",&n);
        if(n==1){
            printf("1\n");
        }
        else if(n==2){
            printf("-1\n");
        }
        else{
            ll l=0,r=n;
            while(l<r){
                ll mid=(l+r+1)>>1;
                if(check(mid)) l=mid;
                else r=mid-1;
            }
            printf("%lld\n",l);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q619718

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值