zzuli 第九届ACM校赛题解

本文是zzuli第九届ACM程序设计大赛的题解,包括多个编程问题的描述、输入输出格式、样例及解题提示,涉及射气球问题、Base64解密、前缀和数组、管道交通、比赛胜率计算、汤饭窗口模拟和二进制转换等算法挑战。

题目链接:https://acm.zzuli.edu.cn/zzuliacm/contest.php?cid=1220



“玲珑杯”郑州轻工业学院第九届ACM程序设计大赛暨河南高校邀请赛-正式赛



Problem A: tmk射气球

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 575   Solved: 106

Submit Web Board

Description

有一天TMK在做一个飞艇环游世界,突然他发现有一个气球匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去射气球,为了提高射击的准确性,他首先在飞艇上找到一个离气球最近的一个点,然后射击(即使气球在飞船的正上方),现在求某些时刻飞艇上的点和气球的距离最小是多少(这个最小距离我们简称为飞艇到气球的距离)。

Input

第一行一个整数T(T<=20),表示有T组测试数据

每组测试数据,有两行。

第一行有5个整数,h,x1,y1,x2,y2,其中h表示飞船的高度,飞船可抽象为一个线段,(x1,y1)(x2,y2)分别是这个线段的端点(有可能会有(x1,y1)(x2,y2)重合的情况)

第二行有6个整数,x,y,z,X,Y,Z分别表示气球的在第0秒的时候的横坐标,纵坐标,高度,一秒时间气球横坐标的变化量,一秒时间气球纵坐标的变化量,一秒时间气球高度的变化量(如果现在气球在(x0,y0,z0)下一秒坐标就为(x0+X,y0+Y,z0+Z))

第三行1个整数n,表示询问组数

接下来的n行,每行一个整数,表示询问的秒数t

题目涉及的整数除了T以外,范围均为[0,1000]

Output

每组询问输出n行,每行输出一个数,表示在t秒的时候飞艇与气球的距离最小是多少,保留两位小数

Sample Input

1
1 1 1 2 2
0 0 0 4 4 4 
2
0
3

Sample Output

1.73
17.92

HINT




解析:三个点建一个三角形,然后如下图,一共就三种情况,a代表飞船,b、c代表飞船到气球的两条边,图1是线段右端点距离气球近(角C是钝角),输出b,图2是左端点距离近(角B是钝角),输出c,图3是输出h,下面分别模拟这三种情况就好,比较坑的是要用double,用int分开的每一个计算都要*1.0,不然WA


代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
#include<string>
#define N 1000009
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        double h, x1, x2, y1, y2, x, y, z, X, Y, Z;
        int n, T;
        scanf("%lf%lf%lf%lf%lf", &h, &x1, &y1, &x2, &y2);
        scanf("%lf%lf%lf%lf%lf%lf", &x, &y, &z, &X, &Y, &Z);
        scanf("%d", &n);
        while(n--)
        {
            scanf("%d", &T);
            double xx, yy, zz;
            xx = x + X*T; yy = y + Y*T; zz = z + Z*T;
            if(abs(x1-x2)==0&&abs(y1-y2)==0)
            {
                printf("%.2f\n", sqrt(1.0*(x1-xx)*(x1-xx) + (y1-yy)*(y1-yy) + (h-zz)*(h-zz)));
                continue;
            }

            double p, a, b, c;
            a = sqrt(1.0*(x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
            b = sqrt(1.0*(x1-xx)*(x1-xx) + (y1-yy)*(y1-yy) + (h-zz)*(h-zz));
            c = sqrt(1.0*(xx-x2)*(xx-x2) + (yy-y2)*(yy-y2) + (zz-h)*(zz-h));
            p = (a + b + c) / 2.0;
            double s = sqrt(p*(p-a)*(p-b)*(p-c));
            double C = a*a+b*b-c*c;
            if(C < 0)
            {
                printf("%.2f\n", b);
                continue;
            }
            double B = a*a+c*c-b*b;
            if(B < 0)
            {
                printf("%.2f\n", c);
                continue;
            }
            printf("%.2f\n", s*2.0/a);
        }
    }
    return 0;
}

Problem B: base64解密

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 348   Solved: 153

Submit Web Board

Description

码值

字符

码值

字符

码值

字符

码值

字符

码值

字符

码值

字符

码值

字符

码值

字符

0

A

8

I

16

Q

24

Y

32

g

40

o

48

w

56

4

1

B

9

J

17

R

25

Z

33

h

41

p

49

x

57

5

2

C

10

K

18

S

26

### ZZULIOJ平台上的C++目解答与解思路 针对ZZULIOJ平台上编号为1001的目,虽然原始讨论主要围绕C语言展开[^1],但可以合理推测该平台同样提供了适用于C++的版本。对于希望使用C++解决这些问的学习者而言,理解核心算法和数据结构至关重要。 #### 使用C++解决问的关键要素 - **输入输出流**:相较于C语言中的`scanf`和`printf`函数,在C++中推荐利用标准库提供的`cin`和`cout`对象来处理程序的数据交互。 - **STL容器的应用**:C++标准模板库(Standard Template Library, STL)内含多种高效实现的基础数据结构如向量(vector),列表(list), 映射(map)等,能够简化编程过程并提高代码可读性和效率。 - **面向对象特性**:适当运用类(class)定义抽象实体及其行为模式,有助于构建模块化程度更高的解决方案;同时支持继承(inheritance)机制下的代码重用以及多态(polymorphism)带来的灵活性扩展。 下面给出一段简单的C++代码框架用于求解一般性的数值计算问: ```cpp #include <iostream> using namespace std; int main() { int num; cout << "请输入一个整数:" ; cin >> num; // 获取用户输入 // 进行业务逻辑运算... cout << "结果是:" << result << endl; // 输出最终结果 return 0; } ``` 此段伪代码展示了如何通过命令行界面接收参数、执行必要的操作后再反馈给调用方。具体到每一道实际考,则需依据其特定要求调整上述模板内的细节部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值