每日一題——云服務計費問題

云服務計費問題(哈希表 + 排序)| 附詳細 C源碼解析

    • 一、題目描述
    • 二、輸入描述
    • 三、輸出描述
    • 四、樣例輸入輸出
      • 輸入示例:
      • 輸出示例:
      • 說明:
    • 五、解題思路分析
    • 六、C實現源碼詳解(完整)
    • 七、復雜度分析

一、題目描述

云服務提供商會記錄客戶使用服務的計費日志。現在你需要根據這些日志為客戶計算話單總費用。

日志記錄包括:

  • 時間戳(長度為 10 的字符串)
  • 客戶標識(長度為 1~16 的字符串)
  • 計費因子(長度為 1~16 的字符串)
  • 計費時長(整數范圍為 0~100,超出視為非法并置為 0)

此外還提供一張計費因子單價表,未給出的因子視為單價為 0。

特殊規則

  • 同一客戶 同一時間戳 同一計費因子 的記錄只計一次,以首次記錄為準。

你需要輸出每個客戶的總話單費用,并按客戶標識的字典序升序輸出。


二、輸入描述

第一行:n 表示日志條數
接下來的 n 行:每行格式為 "時間戳,客戶標識,計費因子,計費時長"
下一行:m 表示計費因子單價數
接下來 m 行:每行格式為 "計費因子,單價"

三、輸出描述

每行一個客戶,格式為:

客戶名,總費用

按客戶標識升序輸出。


四、樣例輸入輸出

輸入示例:

5
1627845600,client1,factorA,10
1627845605,client2,factorB,15
1627845610,client1,factorA,5
1627845615,client1,factorB,8
1627845620,client2,factorB,20
2
factorA,5
factorB,7

輸出示例:

client1,131
client2,245

說明:

  • client1:

    • factorA:10 + 5 = 15,單價 5 → 15×5=75
    • factorB:8,單價 7 → 8×7=56
    • 總計:75 + 56 = 131
  • client2:

    • factorB:15 + 20 = 35,單價 7 → 35×7 = 245

五、解題思路分析

  1. 去重處理:需要剔除重復記錄,即:客戶名 + 時間戳 + 計費因子 相同的記錄只取第一個。
  2. 合法性檢查:時長必須在 [0, 100] 范圍,非法按 0 處理。
  3. 單價匹配:若找不到對應的計費因子,則按 0 處理。
  4. 客戶費用計算:統計每個客戶所有有效記錄對應的費用總和。
  5. 排序輸出:按客戶名字典序升序輸出。

六、C實現源碼詳解(完整)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_N 1000            // 日志最大數量
#define MAX_M 1000            // 計費因子最大數量
#define MAX_LEN 100           // ID 字符串最大長度
#define MAX_CLIENTS 1000      // 客戶數量最大值
#define MAX_FACTORS 100       // 計費因子種類最大值// 客戶記錄結構體:包含客戶ID、計費因子ID、累計使用時長
typedef struct {char client_id[MAX_LEN];      // 客戶唯一標識char factor_id[MAX_LEN];      // 計費因子唯一標識int total_duration;           // 使用總時長
} ClientRecord;// 因子價格結構體:記錄每個因子的價格
typedef struct {char factor_id[MAX_LEN];      // 因子IDint price;                    // 因子的單價
} FactorPrice;ClientRecord records[MAX_CLIENTS * MAX_FACTORS]; // 所有客戶因子組合的記錄
int record_count = 0;                             // 當前記錄條數FactorPrice prices[MAX_FACTORS]; // 存儲所有計費因子的價格
int price_count = 0;             // 當前因子數量// 根據客戶ID和因子ID查找對應記錄在數組中的索引位置,若不存在返回 -1
int find_record_index(const char* client_id, const char* factor_id) {for (int i = 0; i < record_count; i++) {if (strcmp(records[i].client_id, client_id) == 0 &&strcmp(records[i].factor_id, factor_id) == 0) {return i; // 找到返回索引}}return -1; // 未找到
}// 獲取某個因子的單價,若找不到返回 0
int get_factor_price(const char* factor_id) {for (int i = 0; i < price_count; i++) {if (strcmp(prices[i].factor_id, factor_id) == 0) {return prices[i].price; // 返回對應單價}}return 0; // 未定義價格時按0處理
}int main() {int n;scanf("%d\n", &n); // 讀取日志記錄數(n 行)char line[200]; // 用于存儲一行輸入for (int i = 0; i < n; i++) {fgets(line, sizeof(line), stdin); // 讀取一行日志數據// 分割字符串,依次提取日志ID、客戶ID、因子ID、時長char* token = strtok(line, ",");char log_id[MAX_LEN], client_id[MAX_LEN], factor_id[MAX_LEN];int duration;strcpy(log_id, token); // 日志IDtoken = strtok(NULL, ",");strcpy(client_id, token); // 客戶IDtoken = strtok(NULL, ",");strcpy(factor_id, token); // 因子IDtoken = strtok(NULL, ",");duration = atoi(token); // 時長// 若時長不合法(負值或超過100),設為0if (duration < 0 || duration > 100) duration = 0;// 查找該客戶因子的記錄int idx = find_record_index(client_id, factor_id);if (idx != -1) {// 已有記錄,直接累計時長records[idx].total_duration += duration;} else {// 沒有記錄,新建一條strcpy(records[record_count].client_id, client_id);strcpy(records[record_count].factor_id, factor_id);records[record_count].total_duration = duration;record_count++; // 記錄數加一}}int m;scanf("%d\n", &m); // 讀取因子價格的條數for (int i = 0; i < m; i++) {fgets(line, sizeof(line), stdin); // 讀取一行因子信息char* token = strtok(line, ",");strcpy(prices[i].factor_id, token); // 因子IDtoken = strtok(NULL, ",");prices[i].price = atoi(token);      // 對應價格price_count++;}// 用于記錄已處理過的客戶,防止重復統計char processed_clients[MAX_CLIENTS][MAX_LEN];int processed_count = 0;for (int i = 0; i < record_count; i++) {int already_processed = 0;// 判斷該客戶是否已經處理過for (int j = 0; j < processed_count; j++) {if (strcmp(processed_clients[j], records[i].client_id) == 0) {already_processed = 1;break;}}if (already_processed) continue; // 已處理,跳過// 標記為已處理strcpy(processed_clients[processed_count++], records[i].client_id);int total_cost = 0; // 該客戶總費用// 累計該客戶所有因子的費用for (int j = 0; j < record_count; j++) {if (strcmp(records[j].client_id, records[i].client_id) == 0) {int price = get_factor_price(records[j].factor_id);total_cost += records[j].total_duration * price;}}// 輸出客戶ID與其總費用printf("%s,%d\n", records[i].client_id, total_cost);}return 0; // 程序結束
}

七、復雜度分析

  • 時間復雜度
    • 去重處理 + 數據讀取: O ( n ) O(n) O(n)
    • 因子價格映射: O ( m ) O(m) O(m)
    • 費用計算: O ( n ) O(n) O(n)
    • 排序輸出: O ( k log ? k ) O(k \log k) O(klogk)(k 為客戶數)
  • 空間復雜度 O ( n + m ) O(n + m) O(n+m)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75780.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75780.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75780.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【JVM】運行時數據區域

文章目錄 1. 程序計數器補充 2. 虛擬機棧2.1 棧幀1. 局部變量表2. 操作數棧3. 動態鏈接4. 方法返回地址補充 3. 本地方法棧4. 堆5. 方法區靜態常量池&#xff08;Class常量池&#xff09;運行時常量池字符串常量池&#xff08;1&#xff09;位置變化&#xff08;2&#xff09;放…

day28圖像處理OpenCV

文章目錄 一、圖像預處理4 邊緣填充4.1 邊界復制&#xff08;BORDER_REPLICATE&#xff09;4.2 邊界反射&#xff08;BORDER_REFLECT&#xff09;4.3 邊界反射101&#xff08;BORDER_REFLECT_101&#xff09;4.4 邊界常數&#xff08;BORDER_CONSTANT&#xff09;4.5 邊界包裹&…

C++ Json-Rpc框架-3項目實現(2)

一.消息分發Dispatcher實現 Dispatcher 就是“消息分發中樞”&#xff1a;根據消息類型 MType&#xff0c;把消息派發給對應的處理函數&#xff08;Handler&#xff09;執行。 初版&#xff1a; #pragma once #include "net.hpp" #include "message.hpp"n…

C++算法優化實戰:破解性能瓶頸,提升程序效率

C算法優化實戰&#xff1a;破解性能瓶頸&#xff0c;提升程序效率 在現代軟件開發中&#xff0c;算法優化是提升程序性能的關鍵手段之一。無論是在高頻交易系統、實時游戲引擎&#xff0c;還是大數據處理平臺&#xff0c;算法的高效性直接關系到整體系統的性能與響應速度。C作…

【PostgreSQL教程】PostgreSQL 特別篇之 語言接口連接PHP

博主介紹:?全網粉絲22W+,CSDN博客專家、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物聯網、機器學習等設計與開發。 感興趣的可…

山東大學軟件學院創新項目實訓開發日志(12)之將對話記錄保存到數據庫中

在之前的功能開發中&#xff0c;已經成功將deepseekAPI接口接入到springbootvue項目中&#xff0c;所以下一步的操作是將對話和消息記錄保存到數據庫中 在之前的開發日志中提到數據庫建表&#xff0c;所以在此刻需要用到兩個表&#xff0c;conversation表和message表&#xff…

Spring-注解編程

注解基礎概念 1.什么是注解編程 指的是在類或者方法上加入特定的注解(XXX) 完成特定功能的開發 Component public classXXX{} 2.為什么要講注解編程 1.注解開發方便 代碼簡潔 開發速度大大提高 2.Spring開發潮流 Spring2.x引入注解 Spring3.x完善注解 Springboot普及 推廣注解…

Dify智能體平臺源碼二次開發筆記(5) - 多租戶的SAAS版實現(2)

目錄 前言 用戶的查詢 controller層 添加路由 service層 用戶的添加 controller層 添加路由 service層-添加用戶 service層-添加用戶和租戶關系 驗證結果 結果 前言 完成租戶添加功能后&#xff0c;下一步需要實現租戶下的用戶管理。基礎功能包括&#xff1a;查詢租…

基于若依的ruoyi-vue-plus的nbmade-boot在線表單的設計(一)架構方面的設計

希望大家一起能參與我的新開源項目nbmade-boot: 寧波智能制造低代碼實訓平臺 主要目標是類似設計jeecgboot那樣的online表單功能,因為online本身沒有開源這部分代碼,而我設計這個是完全開源的,所以希望大家支持支持,開源不容易。 1、數據庫方面設計考慮 是在原來gen_table和…

WebFlux應用中獲取x-www-form-urlencoded數據的六種方法

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

[Python基礎速成]1-Python規范與核心語法

本系列旨在快速掌握Python&#xff0c;實現能夠快速閱讀和理解 Python 代碼&#xff0c;并在可查閱語法的情況下進行 AI 學習。 本篇先了解一下Python基礎知識。 本篇內容較菜鳥教程有所刪減、方便快速構建大綱&#xff0c;且加入了PEP 8規范說明等有助于理解和編寫代碼的說明。…

農民劇團的春天與改變之路

楊天義&#xff0c;男&#xff0c;1966年9月生&#xff0c;中共黨員&#xff0c;江西省吉安市吉水縣水南農民劇團團長。 楊天義從廢品收購起家&#xff0c;憑借自身的努力和奮斗&#xff0c;自籌資金100余萬元建設了水南鎮的第一座影劇院&#xff0c;組建了江西省吉安市吉水縣…

python asyncio 的基本使用

1、引言 asyncio 是 Python 標準庫中的一個庫&#xff0c;提供了對異步 I/O 、事件循環、協程和任務等異步編程模型的支持。 asyncio 文檔 2、進程、線程、協程 線程 線程是操作系統調度的基本單位&#xff0c;同一個進程中的多個線程共享相同的內存空間。線程之間的切換由操…

Leedcode刷題 | Day30_貪心算法04

一、學習任務 452. 用最少數量的箭引爆氣球代碼隨想錄435. 無重疊區間763. 劃分字母區間 二、具體題目 1.452用最少數量的箭引爆氣球452. 用最少數量的箭引爆氣球 - 力扣&#xff08;LeetCode&#xff09; 在二維空間中有許多球形的氣球。對于每個氣球&#xff0c;提供的輸…

Ant Design Vue 表格復雜數據合并單元格

Ant Design Vue 表格復雜數據合并單元格 官方合并效果 官方示例 表頭只支持列合并&#xff0c;使用 column 里的 colSpan 進行設置。 表格支持行/列合并&#xff0c;使用 render 里的單元格屬性 colSpan 或者 rowSpan 設值為 0 時&#xff0c;設置的表格不會渲染。 <temp…

C++ 標準庫中的 <algorithm> 頭文件算法總結

C 常用 <algorithm> 算法概覽 C 標準庫中的 <algorithm> 頭文件提供了大量有用的算法&#xff0c;主要用于操作容器&#xff08;如 vector, list, array 等&#xff09;。這些算法通常通過迭代器來操作容器元素。 1. 非修改序列操作 std::all_of, std::any_of, s…

程序化廣告行業(84/89):4A廣告代理公司與行業資質解讀

程序化廣告行業&#xff08;84/89&#xff09;&#xff1a;4A廣告代理公司與行業資質解讀 大家好&#xff01;在探索程序化廣告行業的道路上&#xff0c;每一次知識的分享都是我們共同進步的階梯。一直以來&#xff0c;我都希望能和大家攜手前行&#xff0c;深入了解這個充滿機…

deepin使用autokey添加微信快捷鍵一鍵顯隱ctrl+alt+w

打開deepin商店&#xff0c;搜索快捷鍵&#xff0c;找到autokey 快捷鍵管理&#xff0c;點擊安裝 點擊右鍵新建文件夾 點擊右鍵新建腳本 打開腳本并添加以下內容 import subprocess import time# ------------------ 配置項 ------------------ WM_CLASS "wechat…

文件內容課堂總結

Spark SQL是Spark用于結構化數據處理的模塊&#xff0c;前身是Shark。Shark基于Hive開發&#xff0c;雖提升了SQL-on-Hadoop效率&#xff0c;但對Hive依賴過多。2014年6月1日Shark項目停止開發&#xff0c;團隊將資源投入Spark SQL項目。Spark SQL具有諸多優點&#xff0c;如擺…

Zotero PDF Translate 翻譯插件使用OpenAI API配置教程

PDF Translate&#xff1a;提升 Zotero 內置 PDF 閱讀器的翻譯功能 “PDF Translate” 是一款為 Zotero 設計的插件&#xff0c;旨在方便用戶在 Zotero 內置的 PDF 閱讀器中進行劃詞或段落翻譯&#xff0c;輔助閱讀外文文獻。 一、 安裝插件 下載插件&#xff1a; 訪問 PDF T…