编程之美初赛第一场

来源:互联网 发布:vb语言的有什么好处 编辑:程序博客网 时间:2024/04/30 13:04

题目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)



样例输入
25.4mm 5.27mm 1600px5400um 0.00527m 1600px
样例输出
Case 1: 1639.47pxCase 2: 1639.47px
这题用stringstream跪到死,以后让我怎么敢用你骂人
                        #define DeBUG#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <vector>#include <stack>#include <queue>#include <string>#include <set>#include <sstream>#include <map>#include <bitset>using namespace std ;#define zero {0}#define INF 0x3f3f3f3f#define EPS 1e-6typedef long long LL;const double PI = acos(-1.0);//#pragma comment(linker, "/STACK:102400000,102400000")inline int sgn(double x){return fabs(x) < EPS ? 0 :(x < 0 ? -1 : 1);}double tomm(double a,string d){    if(d=="mm")        return a;    else if(d=="m")        return a*1000;    else if(d=="dm")        return a*100;    else if(d=="cm")        return a*10;    else if(d=="um")        return a/1000.0;    else if(d=="nm")        return a/1000000.0;}int cnt=1;int main(){        #ifdef DeBUGs        freopen("C:\\Users\\Sky\\Desktop\\1.in","r",stdin);    #endif    int T;    scanf("%d", &T);    double a,b,c;    getchar();    while(T--)    {        char da[100],db[100],dc[100];        scanf("%lf%s %lf%s %lf%s",&a,da,&b,db,&c,dc);        a=tomm(a,string(da));        b=tomm(b,string(db));        printf("Case %d: %.2lfpx\n",cnt++,c*a/b);    }        return 0;}


题目3 : 活动中心

时间限制:12000ms
单点时限:6000ms
内存限制:256MB

描述

A市是一个高度规划的城市,但是科技高端发达的地方,居民们也不能忘记运动和锻炼,因此城市规划局在设计A市的时候也要考虑为居民们建造一个活动中心,方便居住在A市的居民们能随时开展运动,锻炼强健的身心。

城市规划局希望活动中心的位置满足以下条件:

1. 到所有居住地的总距离最小。

2. 为了方便活动中心的资源补给和其他器材的维护,活动中心必须建设在A市的主干道上。


为了简化问题,我们将A市摆在二维平面上,城市的主干道看作直角坐标系平的X轴,城市中所有的居住地都可以看成二维平面上的一个点。

现在,A市的城市规划局希望知道活动中心建在哪儿最好。


输入

第一行包括一个数T,表示数据的组数。

接下来包含T组数据,每组数据的第一行包括一个整数N,表示A市共有N处居住地

接下来N行表示每处居住地的坐标。


输出

对于每组数据,输出一行“Case X: Y”,其中X表示每组数据的编号(从1开始),Y表示活动中心的最优建造位置。我们建议你的输出保留Y到小数点后6位或以上,任何与标准答案的绝对误差或者相对误差在10-6以内的结果都将被视为正确。


数据范围

小数据:1 ≤ T ≤ 1000, 1 ≤ N ≤ 10

大数据:1 ≤ T ≤ 10, 1 ≤ N ≤ 105

对于所有数据,坐标值都是整数且绝对值都不超过106



样例解释

样例1:活动中心的最优建造位置为(1.678787, 0)



样例输入
131 12 23 3
样例输出
Case 1: 1.678787
#define DeBUG#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <vector>#include <stack>#include <queue>#include <string>#include <set>#include <sstream>#include <map>#include <bitset>using namespace std ;#define zero {0}#define INF 0x3f3f3f3f#define EPS 1e-7typedef long long LL;const double PI = acos(-1.0);//#pragma comment(linker, "/STACK:102400000,102400000")inline int sgn(double x){    return fabs(x) < EPS ? 0 : (x < 0 ? -1 : 1);}double fdis(double x1, double y1, double x2, double y2){    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));}struct point{    double x, y;};point p[100005];int n;double get(double x){    double sum = 0;    for (int i = 0; i < n; i++)    {        sum += fdis(p[i].x, p[i].y, x, 0);    }    return sum;}int cnt=1;int main(){#ifdef DeBUGs    freopen("C:\\Users\\Sky\\Desktop\\1.in", "r", stdin);#endif    int T;    scanf("%d", &T);    while (T--)    {        scanf("%d", &n);        for (int i = 0; i < n; i++)        {            scanf("%lf%lf", &p[i].x, &p[i].y);        }        double l, r, mid, midmid;        l = -1000000.0;        r = 1000000.0;        double mid_value, midmid_value;        while (r - l > EPS)        {            mid = (l + r) / 2;            midmid = (mid + r) / 2;            mid_value = get(mid);            midmid_value = get(midmid);            if (mid_value < midmid_value) r = midmid;            else l = mid;        }        printf("Case %d: %.7lf\n",cnt++,mid);    }    return 0;}

三分版题


0 0
原创粉丝点击