• 【NOIP模拟赛】正方形大阵


    正方形大阵

    【问题描述】  

     

    【输入格式】  

    第一行一个正整数n代表询问次数。

    接下来n行每行一个不超过八位的小数k代表一组询问。

    【输出格式】  

    输出共n行,代表每次询问的答案;如果有无数个交点,输出“-1”。

    【输入样例】    

    3
    0.375
    0.001
    0.478
    

    【输出样例】

    -1
    4
    20
    

    【数据规模与约定】

    100%的数据满足1<=n<2*1000,0<k<0.5。

    【试题分析】

     其实这实际上就是一道数学题,我们其实就知道第一个三角形的高、第二个高、第三个高……

     由题可判断出:第二个三角形的高*2=第一个三角形的高。

     其实我们可以根据勾股定理:0.5^2+0.5^2=0.5(第二个正方形的面积)

     那么我们需要用第二个正方形的面积-第三个正方形的面积=4*第一个三角形的面积

     第三个正方形的面积:根号(0.5/2)^2*2=1/4

     第二个正方形减去第三个正方形:0.5-0.25=0.25

     除4:0.25/4=0.0625

     三角形面积为0.0625

     由此可推出三角形高为0.25

     第二个三角形的高:0.125

     以此类推……

     我们只需要判断输入的数在那个区间内。

     我们可以继续数点:第一个区间(0~0.25)交点个数为4,第二个为8……

     所以这道题就非常简单喽……

    【代码】

    #include<iostream>
    using namespace std;
    double a[2004],A[2004];
    int b[2004];
    int n;
    double k;
    void init()
    {
    	a[1]=0.25;
    	A[1]=0.25;
    	a[0]=0;
    	b[0]=4;
    	for(int i=2;i<=2001;i++) {A[i]=(double)A[i-1]/2;}
    	for(int i=2;i<=2001;i++) {a[i]=(double)(a[i-1]+(double)A[i]);}
    	for(int i=1;i<=2001;i++) b[i]=b[i-1]+4;
    }
    void ans(double k)
    {
        for(int i=1;i<=2001;i++) if(a[i]==k) {cout<<"-1"<<endl;return ;}
        for(int i=1;i<=2001;i++) if(a[i-1]<k&&a[i]>k) {cout<<b[i-1]<<endl;return ;}
    }
    int main()
    {
    	init();
    	cin>>n;
    	while(n--)
    	{
    		cin>>k;
    		ans(k);
    	}
    }
  • 相关阅读:
    Bundles
    使用二进制协议 (附源码)
    河内之塔 算法
    什么是DCI
    C#利用ODP.NET往oracle中高效插入百万数据
    分析Sizzle引擎
    data格式加载图片
    jQuery获取checkbox选中项等操作及注意事项
    日期类型函数转换的特殊性
    QT中代码中与设计器中控件信号与SLOT连接(原来还可以这样连接)
  • 原文地址:https://www.cnblogs.com/wxjor/p/5862924.html
Copyright © 2020-2023  润新知