paulzhou的数学?TAT? 【二分打表找规律】

29 篇文章 0 订阅
26 篇文章 0 订阅

paulzhou的数学?TAT?
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 4 Accepted Submission(s) : 4
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
众所周知,paulzhou的数学不太好。现在他有一个问题,希望你帮他解答:
定义,求最小的正整数y使得,其中
Input
第一行输入一个整数T(T<=10),表示测试实例的数量;
每组用例输入一个非负整数n(n<10^100)
Output
对于每组用例,如果y<=5则输出y,否则输出“TAT”
Sample Input
2
233
233333333333333333333333333333333333333333333333333333333
Sample Output
3
TAT
Author
Anonymous

怎么说呢 ,这道题,一看就是找规律的,有临界值,所以要打表找到所有的临界值。还有一点,如果直接暴力找会累死,所以建议用二分找 ;
我找到的临界值
dp[1]=0;
dp[2]=1;
dp[4]=2;
dp[16]=3;
dp[256]=4;
dp[65536]=5;
dp[4294967296]=6; //发现了把,要暴力,机器要报废
// 好吧,没有必要非 用二分(当时光想着打表了,虽然也过了,但确实费力些功夫。朋友给我指点迷津),仔细想想就会发现,对于n==4的时候y==2,那么当y==3的时候,其实就是一个值开根号之后为4就对了所以这个时候n==16 ,依次类推。

打表找规律的代码 (全当多复习下这种的二分用法 Σ( ° △ °|||)︴)

#include<string.h>
#include<stdio.h>
#include<queue>
#include<math.h>
#include<iostream>
#define LL long long
using namespace std;
/************************************/
const int MAXN = 1e6;
const double eps = 1e-8;
const int inf =0x3f3f3f3f;
int num;
void  ss(LL n)
{
    if(n==1) return ;
    num++;
    ss(floor(sqrt(n)));// floor()是向下取整,ceil()是向上取整
}
int main()
{
    LL ans;
    LL l=1;LL r=1e18;
    ans=-1;LL mid;
    while(l<=r)
    {
        mid=(l+r)>>1;
        num=0;
        ss(mid);
        if(num>=6) ans=mid,r=mid-1; // 将这个6不断更改找到临界值
        else l=mid+1;
    }
    printf("%lld\n",ans);
    return 0;
}

AC代码
不管用哪种方法找到的临界值,最后都是一样的。

#include<string.h>
#include<stdio.h>
#include<queue>
#include<iostream>
using namespace std;
/************************************/
int main()
{
    int t;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
       char s[1000];
       gets(s);
       int len =strlen(s);
        int answer;
        if(len==1)
        {
            if(s[0]=='1') answer=0;
            if(s[0]>='2'&&s[0]<'4') answer=1;
            if(s[0]>='4') answer=2;
        } else if(len==2)
        {
            if(strcmp(s,"16")<0) answer=2;
            else answer=3;
        }else if(len==3)
        {
            if(strcmp(s,"256")<0) answer=3;
            else answer=4;
        }else if(len>3&&len<5) answer=4;
        else if(len==5)
        {
            if(strcmp(s,"65536")<0) answer=4;
            else answer=5;
        }else if(len>5 &&len <10 ) answer=5;
        else if(len==10)
        {
            if(strcmp(s,"4294967296")<0) answer=5;
            else answer=6;
        }else answer=6;
        if(answer<6) printf("%d\n",answer);
        else puts("TAT");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值