• 初赛第一场(4月19):题目1:焦距


    题目1 : 焦距

    时间限制:2000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    一般来说,我们采用针孔相机模型,也就是认为它用到的是小孔成像原理。

    在相机坐标系下,一般来说,我们用到的单位长度,不是“米”这样的国际单位,而是相邻像素的长度。而焦距在相机坐标系中的大小,是在图像处理领域的一个非常重要的物理量。

    假设我们已经根据相机参数,得到镜头的物理焦距大小(focal length),和相机胶片的宽度(CCD width),以及照片的横向分辨率(image width),则具体计算公式为:

    Focal length in pixels = (image width in pixels) * (focal length on earth) / (CCD width on earth)

    比如说对于Canon PowerShot S100, 带入公式得

    Focal length in pixels = 1600 pixels * 5.4mm / 5.27mm = 1639.49 pixels

    现在,请您写一段通用的程序,来求解焦距在相机坐标系中的大小。

    输入

    多组测试数据。首先是一个正整数T,表示测试数据的组数。

    每组测试数据占一行,分别为

    镜头的物理焦距大小(focal length on earth)

    相机胶片的宽度(CCD width on earth)

    照片的横向分辨率大小(image width in pixels),单位为px。

    之间用一个空格分隔。

    输出

    每组数据输出一行,格式为“Case X: Ypx”。 X为测试数据的编号,从1开始;Y为焦距在相机坐标系中的大小(focallength in pixels),保留小数点后2位有效数字,四舍五入取整。

    数据范围

    对于小数据:focal length on earth和CCD width on earth单位都是毫米(mm)

    对于大数据:长度单位还可能为米(m), 分米(dm), 厘米(cm), 毫米(mm), 微米(um),纳米(nm)

    样例输入
    2
    5.4mm 5.27mm 1600px
    5400um 0.00527m 1600px
    
    样例输出
    Case 1: 1639.47px
    Case 2: 1639.47px
    
    解析:单位转换问题 && 【字符串操作】
    代码:
     1 #include <iostream>
     2 #include <string>
     3 #include <cstdlib>
     4 using namespace std;
     5 
     6 const string dw[6] = {"m", "dm", "cm", "mm", "um", "nm"};
     7 
     8 inline int find(const string& s)
     9 {
    10     for(int i = 0; i < 6; ++i)
    11     {
    12         if(dw[i] == s) 
    13             return i;
    14     }
    15 }
    16 
    17 int main()
    18 {
    19     int T;
    20     scanf("%d", &T);
    21     for(int k = 1; k <= T; ++k)
    22     {
    23         double d1, d2, d3;
    24         string s1, s2, s3;
    25         cin >> d1 >> s1 >> d2 >> s2 >> d3 >> s3;
    26         int id1, id2;
    27         id1 = find(s1);
    28         id2 = find(s2);
    29 
    30         if(id1 <= 3)
    31             d1 *= pow(10.0,(3-id1));
    32         else
    33             d1 *= pow(10.0, ((3-id1)*3));
    34         if(id2 <= 3)
    35             d2 *= pow(10.0,(3-id2));
    36         else
    37             d2 *= pow(10.0, ((3-id1)*3));
    38 
    39         double ans = d1 / d2 * d3;
    40         printf("Case %d: %.2fpx
    ",k, ans);
    41     }
    42 
    43     return 0;
    44 }
    Code
  • 相关阅读:
    用DropDownList实现的省市级三级联动
    hcheck 脚本
    转 How To Stop A Running Job Using DBMS_JOB
    转 UTL_FILE Throws ORA-29284 Or ORA-29283 When Attempting To READ File
    转 Monitoring Restore/Recovery Progress
    转 禁用HAIP,cluster_interconnects配错了集群无法启动
    转 LIST INCARNATION OF DATABASE
    转 AIX7.2+11.2.0.4RAC实施
    opatch on-line patch and standby-fisrt patch
    转 Oracle]如何在Oracle中设置Event
  • 原文地址:https://www.cnblogs.com/liyangguang1988/p/3675945.html
Copyright © 2020-2023  润新知