云计算百科
云计算领域专业知识百科平台

43-45

43

最高频率

作者: 朱凯

时间限制: 10s

章节: 一维数组

问题描述

明明的爸爸是一位著名的数学家。他在明明很小的时候就发现明明有过人的数学天赋,因此有意培养他对数学的兴趣。一次,明明的爸爸和明明玩起了一个数字游戏,这个游戏的名字叫“最高频率”。在游戏中,明明的爸爸要求明明在一串数字中,找出出现次数最多的那个数字,如果有多个数字出现的次数一样,则取最小的那个数字。明明很快就理解的游戏的规则,开始玩起来。明明的爸爸首先给了明明三个数字:3、2、1;明明很快就回答说:“1”(虽然3、2都出现一次,但是1是最小的数字,因此答案是1)。明明的爸爸很惊讶于明明的反应速度,开始加大游戏的难度,给出了由6个数字组成的数字串:2、1、3、4、5、2;明明眼珠子一转,脱口而出:“2”。明明的爸爸意识到简单的数字串很难难住明明,于是决定给出很长的一串字符串来考明明。但与此同时,明明爸爸面对这很长的数字串,也无法一时就统计出哪个数字出现的次数最高。于是就求助于你,让你帮他写一个程序,用来计算出出现次数最多的那个数字。 明明的爸爸的问题可以归结为:给你一个数字串,里面有n个数字,输出这个数字串中出现次数最多的那个数字;如果有多个数字出现次数一样,则输出其中最小的那个数字。

输入说明

你写的程序需要从标准输入设备(通常为键盘)中读入多组测试数据,每组测试数据仅占一行,每行开始有一个正整数n(1 ≤ n ≤ 200),表示数字串中有n个数字;之后有n个数字,表示数字串中的n个数,其中每个数都大于等于1且小于等于109;每个数字之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明

对于每一组测试数据,你写的程序需要计算出一组相应的运算结果,并将每组运算结果依次写入到标准输出设备(通常为启动该程序的文本终端,例如Windows中的命令行终端)中。每组运算结果为一个整数,即这个数字串中出现次数最多的那个数字;如果有多个数字出现次数一样,则输出其中最小的那个数字。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义数字结构体
typedef struct {
long long value; // 数字值
int count; // 出现次数
} Number;

// 比较函数,用于qsort排序
int compare(const void *a, const void *b) {
const Number *num1 = (const Number *)a;
const Number *num2 = (const Number *)b;

// 先按出现次数降序排序
if (num1->count != num2->count) {
return num2->count – num1->count; // 降序
}
// 如果次数相同,按数值升序排序
return (num1->value – num2->value);
}

int main() {
int n;

// 读取多组测试数据
while (scanf("%d", &n) == 1) {
long long *arr = (long long *)malloc(n * sizeof(long long));
Number *numbers = (Number *)malloc(n * sizeof(Number));

// 读取数字
for (int i = 0; i < n; i++) {
scanf("%lld", &arr[i]);
}

// 统计每个数字的出现次数
int unique_count = 0;

for (int i = 0; i < n; i++) {
int found = 0;

// 检查这个数字是否已经统计过
for (int j = 0; j < unique_count; j++) {
if (numbers[j].value == arr[i]) {
numbers[j].count++;
found = 1;
break;
}
}

// 如果是新数字,添加到统计数组中
if (!found) {
numbers[unique_count].value = arr[i];
numbers[unique_count].count = 1;
unique_count++;
}
}

// 对统计结果排序:先按出现次数降序,次数相同按数值升序
qsort(numbers, unique_count, sizeof(Number), compare);

// 输出结果(第一个就是出现次数最多,次数相同时最小的那个)
printf("%lld\\n", numbers[0].value);

// 释放内存
free(arr);
free(numbers);
}

return 0;
}

44

三艘船

作者: 朱星垠

时间限制: 10s

章节: 一维数组

问题描述

明明由于工作的关系,经常需要坐船到某地出差办事。久而久之,明明就对这两地之间船的班次情况相当了解,他会根据办事的具体情况选择不同班次的船出行。这两地的船一共分为三个班次:特快船、快船、慢船,三个班次的船在同一天的0点从港口出发,并沿着同一路线匀速航行,只是它们到达目的地的时刻不同。 你作为明明的好朋友,有一次和明明在闲聊,问到他出差时船的航行距离有多少时,明明没有正面回答你这个问题,而只是把三艘船(特快、快、慢)的速度,以及它们到达目的地的时间是几点钟(并不知道分别是哪一天,只知道三艘船都在100天以内到达了终点)告诉了你,要你推算出两地间的距离长度。你作为一位程序设计专家,自然不会被明明的这个问题所难倒,于是你决定写一个程序,来求解这个看似困难其实简单的问题。 明明的问题可以归结为:给出三艘船的速度,以及它们到达目的地时是几点钟(并不知道分别是哪一天,只知道三艘船都在100天以内到达了终点),求两地间的距离到底有多少。若有多组解,只输出最小的那组解。

输入说明

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据占二行,第一行有3个正整数a、b、c,代表3艘船的到达港口那天的时间是几点钟(0≤a、b、c≤23)。第二行有3个正整数d、e、f代表3艘船的速度(0<d、e、f<30000),速度的单位是单位距离每小时。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果由一个整数构成,代表路程的长度,若有多组解,只输出最小的那组解。每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。

#include <stdio.h>

int main() {
int t1, t2, t3;
int v1, v2, v3;

while (scanf("%d %d %d", &t1, &t2, &t3) == 3) {
scanf("%d %d %d", &v1, &v2, &v3);

long long min_S = -1; // 初始化为未找到

// 枚举第一艘船的天数 D1
for (int D1 = 0; D1 < 100; D1++) {
long long T1 = 24LL * D1 + t1; // 总航行时间(小时)
long long S = v1 * T1; // 路程

// 检查第二艘船
if (S % v2 != 0) continue;
long long T2 = S / v2; // 第二艘船的总时间
if (T2 < t2) continue;
if ((T2 – t2) % 24 != 0) continue;
long long D2 = (T2 – t2) / 24;
if (D2 < 0 || D2 >= 100) continue;

// 检查第三艘船
if (S % v3 != 0) continue;
long long T3 = S / v3;
if (T3 < t3) continue;
if ((T3 – t3) % 24 != 0) continue;
long long D3 = (T3 – t3) / 24;
if (D3 < 0 || D3 >= 100) continue;

// 所有条件满足,记录最小的 S
if (min_S == -1 || S < min_S) {
min_S = S;
}
}

printf("%lld\\n", min_S);
}

return 0;
}

45

#include <stdio.h>

// 计算逆序数
int reverse(int n) {
int rev = 0;
while (n > 0) {
rev = rev * 10 + n % 10;
n /= 10;
}
return rev;
}

// 判断是否是回文数
int is_palindrome(int n) {
return n == reverse(n);
}

int main() {
int n;
int first_case = 1;

while (scanf("%d", &n) == 1) {
if (n == 0) break;

// 不用处理 first_case 输出空行,因为题目不允许有空行
// 直接输出过程

while (1) {
int rev = reverse(n);
int sum = n + rev;
printf("%d+%d=%d\\n", n, rev, sum);
if (is_palindrome(sum)) {
break;
}
n = sum;
}
}

return 0;
}

翻译:虚拟现实(VR@)越来越受欢迎,因为计算机图形学已经发展到图像往往与现实世界无法区分的地步。然而,游戏、电影和其他媒体中呈现的计算机生成图像与我们的物理环境是分离的。这既是一种美德,一切皆有可能,也是一种限制。
这种局限性来自我们对日常生活的主要兴趣,它不是针对一些虚拟世界,而是针对我们周围的现实世界。在许多方面,增强移动计算,使与现实世界的联系自动发生,似乎是一个有吸引力的提议。增强现实(AR)有望在物理世界和电子信息之间建立直接、自动和可操作的联系。它为电子增强的物理世界提供了一个简单而即时的用户界面。AR可以将计算机生成的信息叠加在现实世界的视图上,以非凡的新方式放大人类的感知和认知。
二、定义和范围
VR将用户置于完全由计算机生成的环境中,而AR旨在呈现直接注册到物理环境中的信息。AR超越了移动计算,因为它在空间和认知上弥合了虚拟世界和现实世界之间的差距。有了AR,数字信息似乎成为了现实世界的一部分,至少在用户的感知中是这样。

单词:

赞(0)
未经允许不得转载:网硕互联帮助中心 » 43-45
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!