恒生电子比赛 恒生电子秋招 恒生电子笔试题 1011

笔试时间:2025年10月11日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

某农业科技公司在全国各地拥有多个农场,并种植各种农作物。为了监测农作物的生长情况,公司记录了每个农场、每种农作物在不同时间点的健康指数以及最终的产量。

数据库结构如下:

  • farms表:存储农场的基本信息 farm_id:农场ID,主键farm_name:农场名称location:农场所在地area_hectares:农场面积(公顷)
  • crops表:存储农作物的基本信息 crop_id:农作物ID,主键crop_name:农作物名称crop_type:农作物类型(如:谷物、蔬菜)
  • crop_data表:存储农作物在特定农场的监测数据 data_id:数据记录ID,主键farm_id:关联的农场IDcrop_id:关联的农作物IDplanting_date:农作物种植日期measurement_date:数据测量日期health_index:健康指数yield_kg_per_hectare:每公顷产量(千克/公顷)

需求描述

编写一个SQL查询,统计监测日期在2024年3月至2024年6月期间,每种农作物在不同农场的生长情况,包括:

  • 农场名称
  • 农作物名称
  • 农作物类型
  • 平均健康指数(保留两位小数)
  • 每公顷平均产量(公斤, 保留整数)
  • 生长天数(从种植到最后一次测量的天数)

要求

  • 只统计期间有至少3次测量记录的农作物
  • 按照平均健康指数降序排序,如果健康指数相同,则按照每公顷平均产量降序排序,如果产量也相同,则按农场名称字母顺序升序排列

样例输入

CREATE TABLE farms (

farm_id INT PRIMARY KEY,

farm_name VARCHAR(100) NOT NULL,

location VARCHAR(100) NOT NULL,

area_hectares DECIMAL(10,2) NOT NULL

);

CREATE TABLE crops (

crop_id INT PRIMARY KEY,

crop_name VARCHAR(100) NOT NULL,

crop_type VARCHAR(50) NOT NULL

);

CREATE TABLE crop_data (

data_id INT PRIMARY KEY,

farm_id INT NOT NULL,

crop_id INT NOT NULL,

planting_date DATE NOT NULL,

measurement_date DATE NOT NULL,

health_index DECIMAL(4,2) NOT NULL,

yield_kg_per_hectare DECIMAL(8,2) NOT NULL

);

-- 插入农场数据

INSERT INTO farms VALUES

(1, 'Green Valley Farm', '华北平原', 120.50),

(2, 'Sunshine Acres', '长江三角洲', 85.75);

-- 插入农作物数据

INSERT INTO crops VALUES

(1, '小麦', '谷物'),

(2, '玉米', '谷物'),

(3, '水稻', '谷物'),

(4, '番茄', '蔬菜');

-- 插入农作物监测数据

-- Green Valley Farm - 小麦

INSERT INTO crop_data VALUES

(1, 1, 1, '2024-03-10', '2024-03-25', 8.70, 0.00),

(2, 1, 1, '2024-03-10', '2024-04-15', 9.20, 0.00),

(3, 1, 1, '2024-03-10', '2024-05-15', 9.50, 4800.00),

-- Green Valley Farm - 玉米

(4, 1, 2, '2024-04-05', '2024-04-20', 8.50, 0.00),

(5, 1, 2, '2024-04-05', '2024-05-15', 8.90, 0.00),

(6, 1, 2, '2024-04-05', '2024-06-10', 9.10, 6500.00),

-- Sunshine Acres - 水稻

(7, 2, 3, '2024-04-15', '2024-05-01', 9.10, 0.00),

(8, 2, 3, '2024-04-15', '2024-05-20', 9.40, 0.00),

(9, 2, 3, '2024-04-15', '2024-06-15', 9.60, 6200.00),

-- Sunshine Acres - 番茄

(10, 2, 4, '2024-03-20', '2024-04-05', 8.90, 0.00),

(11, 2, 4, '2024-03-20', '2024-05-10', 9.30, 0.00),

(12, 2, 4, '2024-03-20', '2024-06-05', 9.50, 35000.00);

样例输出

farm_name|crop_name|crop_type|avg_health_index|avg_yield_kg_per_hectare|growth_days

Sunshine Acres|水稻|谷物|9.37|6200|61

Sunshine Acres|番茄|蔬菜|9.23|35000|77

Green Valley Farm|小麦|谷物|9.

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

10-12 18:27
已编辑
江苏大学 C++
#include <iostream>#include <map>using namespace std;using ll = long long;const int N = 1e6 + 5;int prime[N], a[N];int vis[N];int n, m;void initPrime(int n){int cnt = 0;fill(vis, vis + N, 0);for(int i = 2; i <= n; i++){if(vis[i] == 0) {vis[i] = i; prime[++cnt] = i;}for(int j = 1; j <= cnt; j++){if(1ll * prime[j] * i > n) break;vis[prime[j] * i] = prime[j]; //最小素因子if(i % prime[j] == 0) break;}}}struct HashRoll {static const long long BASE1 = 131, BASE2 = 233;static const long long MOD1 = 1000000007, MOD2 = 1000000009;static pair<ll, ll> get(const map<int, int>& data) {long long h1 = 0, h2 = 0;for (auto [k, v] : data) {if(v == 0) continue;h1 = (h1 * BASE1 + k * 7) % MOD1;h2 = (h2 * BASE2 + k * 13) % MOD2;}return {h1, h2};}};void getPrimer(int x, map<int, int>& mp) {while(x > 1) {int p = vis[x];mp[p] ^= 1; // 只记录奇数次出现的素因子x /= p;}}// 题意 : 返回最长子数组长度,满足子数组内每个数的素因子出现偶数次// 时间复杂度 O(n log(max(a[i]))), 空间复杂度 O(n), 在1e6范围内不会TLE/*思路: 前缀哈希 + 哈希滚动对每个前缀积分解质因数,记录每个质因数出现的次数的奇偶性用哈希滚动记录前缀积的质因数奇偶性状态(朴素想法是直接用n个map数组保存不同前缀积的状态,然后每次去对比不同map的状态是否一致,但这样每次对比map是否一致复杂度过高,因此直接将map状态hash即可,这里用双hash是为了降低冲突概率)如果a[0]到a[l]前缀状态和a[0]到a[r]的前缀状态相同,说明中间的子数组a[l+1]到a[r]的乘积的每个质因数出现偶数次,那么这个子数组乘积是一个完全平方数(每个质因数的指数都是偶数,显然)用哈希表记录每个前缀状态第一次出现的位置,更新最长子数组长度ans*/int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin >> n;initPrime(1e6);for(int i = 1; i <= n; i++) cin >> a[i];map<int, int> mp; // 记录的是前缀积质因分解后每个质因数出现次数的奇偶性map<pair<ll, ll>, int> mp2; // 记录的是某种前缀积状态第一次出现的下标mp2[{0, 0}] = 0; // 初始状态int ans = -1;for(int i = 1; i <= n; i++) {getPrimer(a[i], mp);auto hashPair = HashRoll::get(mp);if(mp2.count(hashPair)) { // 如果存在同状态,说明中间子数组乘积质因数出现次数均为偶数次,是完全平方,故更新答案ans = max(ans, i - mp2[hashPair]);}else mp2[hashPair] = i; // 不存在该状态。代表第一次出现该状态,记录下标}cout << ans << "\n";return 0;}
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务