zcmu-1595 TomCat要吃饭(找规律简单题)

Description

TomCat 是一次单身Cat,但是他有着很多的基友,每次吃饭都会QQ他的某一只基友,然而,他的基友Jerry 总是很墨迹。等待是无聊的,这时TomCat在学校的地上乱走,这时他发现地上有方块铺成的,他按照下图的规律走,现在无聊的TomCat想知道,他如果走了n步,他应该在什么位置,位置用坐标(x,y)表示。

Input

每次输入一个数n,n=0是输入结束(n<=2*10^9)

Output

输出坐标(x,y)

Sample Input

8 20 25 0

Sample Output

2 3 5 4 1 5

1.容易发现紧靠坐标轴的两条数字是i * i,和 i * i +1,然后判断给出的n离哪个更近,判断更靠近的那个数a[i] = i * i 中 i 的奇偶,i是偶数,n在竖着的那条里,可以确定n的x坐标;n是奇数,n就在横着的那条里,可以确定n的y坐标。

扫描二维码关注公众号,回复: 2985539 查看本文章

2.最近很喜欢对数据先预处理一下,感觉会更省时间一点。

【一点体会】

这道题是我“7.26 五-暑假训练赛”里的一道题目,今天刷oj碰到了,自己写了一遍,感觉暑假的进步还是很大的,这道题我当时写的磕磕绊绊的,而且当时的解题报告笔记本里最后还留了个这个,

现在能流畅的写出来了,感觉很开心哟! 

#include<cstdio>
#include <cstring>
#include<algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 2e9 + 5;
const int x = 1e5 + 10;
int a[x];
void init()//预处理
{
    for(int i = 1 ; i <= sqrt(maxn);i++ )
    {
        a[i] = i * i;
        //cout<<a[i]<<endl;
    }
}
int main()
{
    init();
    int n;
    while(cin>>n)
    {
        int res_x,res_y;
        if(n == 0)
            break;
        if(n == 1)
            printf("1 1\n");
        else
        {
            for(int i = 1; i < x;i++)
            {
                if(n == a[i])
                {
                    if(i % 2 == 0)
                        printf("%d 1\n",i);
                    else
                        printf("1 %d\n",i);
                }
                else if(n > a[i] && n < a[i + 1])
                {
                    int dis_1 = abs(a[i] - n);
                    int dis_2 = abs(a[i + 1] - n);
                    if(dis_1 < dis_2)//取i,判断i的奇偶
                    {
                        if(i % 2 == 0)
                        {
                            res_x = i + 1;
                            res_y = n - a[i];
                            printf("%d %d\n",res_x,res_y);
                            break;
                        }
                        else
                        {
                            res_y = i + 1 ;//????
                            res_x = n - a[i];
                            printf("%d %d\n",res_x,res_y);
                            break;
                        }
                    }
                    else if(dis_1 > dis_2)//取 i + 1,判断i + 1的奇偶
                    {
                        if((i + 1) % 2 == 0)
                        {
                            res_x = i + 1;
                            res_y = a[i + 1] - n + 1;
                            printf("%d %d\n",res_x,res_y);
                            break;
                        }
                        else
                        {
                            res_y = i + 1;
                            res_x = a[i + 1] - n + 1;
                            printf("%d %d\n",res_x,res_y);
                            break;
                        }
                    }
                }
            }
        }
    }
    
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hzyhfxt/article/details/82153696
今日推荐