zzuli 第九届ACM校赛题解

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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

a

34

i

42

q

50

y

58

6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值