zoukankan      html  css  js  c++  java
  • 【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);
    	}
    }
  • 相关阅读:
    OpenCascade Ray Tracing Rendering
    Create New Commands in Tcl
    OpenCascade Modeling Algorithms Fillets and Chamfers
    OpenCascade Modeling Algorithms Boolean Operations
    Construction of Primitives in Open Cascade
    Open Cascade Data Exchange STL
    Tcl Tk Introduction
    Open Cascade DataExchange IGES
    Netgen mesh library : nglib
    Hello Netgen
  • 原文地址:https://www.cnblogs.com/wxjor/p/5862924.html
Copyright © 2011-2022 走看看