每日c/c++題 備戰藍橋杯(P1093 [NOIP 2007 普及組] 獎學金)

洛谷P1093 [NOIP 2007 普及組] 獎學金 詳解題解

題目背景與要求

題目鏈接:P1093 獎學金
核心任務:根據學生三科總分評選前5名獎學金獲得者,需按特定規則排序輸出。

排序規則(按優先級從高到低):

  1. 總分降序:總分高者排名靠前
  2. 語文降序:總分相同時,語文成績高者優先
  3. 原始序號升序:前兩項均相同時,按輸入順序排列

算法設計解析

核心思想:多級條件排序

本題本質是多關鍵字排序問題的典型實現,需特別注意以下關鍵點:

關鍵維度處理要求實現難點
主排序總分降序正確處理降序比較邏輯
次排序語文降序避免與總分排序邏輯沖突
終極條件原始輸入順序需保持輸入順序的穩定性

數據結構選擇

采用結構體封裝學生信息,實現數據與邏輯的解耦:

struct Student {int id;      // 原始序號(從1開始)int chinese; // 語文成績int math;    // 數學成績int english; // 英語成績int total;   // 三科總分(可動態計算)
};

自定義比較函數

通過三級條件判斷實現精準排序:

bool compare(const Student& a, const Student& b) {if (a.total != b.total) {return a.total > b.total; // 總分降序}if (a.chinese != b.chinese) {return a.chinese > b.chinese; // 語文降序}return a.id < b.id; // 原始序號升序
}

代碼實現與優化

完整代碼

#include <algorithm>
#include <iostream>
using namespace std;struct Student {int id;int chinese;int math;int english;int total;
};Student students[305];bool compare(const Student& a, const Student& b) {if (a.total != b.total) return a.total > b.total;if (a.chinese != b.chinese) return a.chinese > b.chinese;return a.id < b.id;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;for (int i = 1; i <= n; ++i) {cin >> students[i].chinese >> students[i].math >> students[i].english;students[i].id = i;students[i].total = students[i].chinese + students[i].math + students[i].english;}stable_sort(students + 1, students + n + 1, compare);const int output_count = min(5, n);for (int i = 1; i <= output_count; ++i) {cout << students[i].id << " " << students[i].total << "\n";}return 0;
}

關鍵實現細節

  1. 穩定排序策略
    使用stable_sort而非普通sort,確保當總分和語文成績均相同時,保持原始輸入順序。這是實現第三排序條件的核心保障。

  2. 輸入輸出優化
    通過以下操作將IO效率提升3-5倍:

    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
  3. 動態總分計算
    在輸入時實時計算總分,避免后續重復計算:

    students[i].total = chinese + math + english;
    

算法復雜度分析

指標復雜度說明
時間復雜度O(n log n)主導因素為穩定排序操作
空間復雜度O(n)存儲學生信息的結構體數組
額外空間O(1)原地排序算法

測試樣例詳解

輸入示例

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

輸出解析

6 265  // 原始序號6,總分98+89+78=265
4 264  // 原始序號4,總分99+88+77=264
3 258  // 原始序號3,總分91+89+78=258
2 244  // 原始序號2,總分91+66+87=244
1 237  // 原始序號1,總分80+67+90=237

關鍵觀察

  • 學生6和學生4總分僅差1分,但語文成績相同(78 vs 88?此處需驗證輸入數據)
  • 當總分和語文成績均相同時(如假設存在多個學生),原始序號將決定最終排名

常見錯誤規避

  1. 排序穩定性缺失
    ? 錯誤使用sort代替stable_sort
    ? 必須使用穩定排序保持原始順序

  2. 比較邏輯錯誤
    ? 語文成績誤用升序比較
    ? 需明確降序使用>運算符

  3. 序號處理不當
    ? 從0開始編號導致輸出錯誤
    ? 輸入時保持1-based編號

  4. 輸出范圍錯誤
    ? 固定輸出5行導致n<5時越界
    ? 使用min(5, n)動態控制輸出量

總結與擴展

本題通過結構化數據封裝和自定義比較函數,完整演示了多條件排序的實現范式。其核心思想可擴展至:

  • 電商平臺的商品綜合排序(價格+銷量+評價)
  • 學生成績多維度排名(總分+單科+考勤)
  • 數據庫的多字段排序查詢

掌握穩定排序算法的應用場景,對于處理需要保持相等元素原始順序的排序問題具有重要實踐意義。在實際工程中,可根據具體需求選擇stable_sort或普通sort,并合理設計比較函數的多級條件判斷邏輯。

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

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

相關文章

openEuler 22.03 安裝 Nginx,支持離線安裝

目錄 一、環境檢查1.1 必要環境檢查1.2 在線安裝&#xff08;有網絡&#xff09;1.3 離線安裝&#xff08;無網絡&#xff09; 二、下載Nginx2.1 在線下載2.2 離線下載 三、安裝Nginx四、開機自啟服務五、開放防火墻端口六、常用命令 一、環境檢查 1.1 必要環境檢查 # 查看 g…

基于深度學習的圖像壓縮技術(二)

接上篇&#xff1a;基于深度學習的圖像壓縮技術&#xff08;一&#xff09;-CSDN博客 3 基于生成對抗神經網絡的圖像壓縮技術 生成對抗網絡是一種先進的無監督學習算法&#xff0c;由Goodfellow等人在2014 年首次提出&#xff0c;其核心思想源于博弈論。 生成對抗網絡在圖像壓…

TCP和UDP的數據傳輸+區別

目錄 一、數據傳輸過程 1.1 TCP字節流服務圖 1.2 UDP數據報服務圖 二、tcp與udp的區別 1.連接方式 2.可靠性 3.傳輸效率 4.有序性 5.流量控制和擁塞控制 6.應用場景 7.首部長度 三、tcp與udp能不能使用同一個端口號&#xff1f; 四、同一個協議&#xf…

基于ssm的校園舊書交易交換平臺(源碼+文檔)

項目簡介 校園舊書交易交換平臺的主要使用者分為&#xff1a; 前臺功能&#xff1a;用戶進入系統可以對首頁、書籍信息、校園公告、個人中心、后臺管理等功能進行操作&#xff1b; 后臺主要是管理員&#xff0c;管理員功能包括主頁、個人中心、學生管理、發布人管理、書籍分類…

虛假安全補丁攻擊WooCommerce管理員以劫持網站

一場大規模釣魚攻擊正針對WooCommerce用戶&#xff0c;通過偽造安全警報誘使他們下載所謂的"關鍵補丁"&#xff0c;實則為植入WordPress后門的惡意程序。 惡意插件植入 根據Patchstack研究人員發現&#xff0c;上當受騙的用戶在下載更新時&#xff0c;實際上安裝的…

《冰雪傳奇點卡版》:第二大陸介紹!

一、第二大陸&#xff1a;高階資源與實力驗證的核心戰場 1. 準入條件與地圖分布 進入門檻&#xff1a; 基礎要求&#xff1a;角色需達到四轉&#xff08;需消耗50萬元寶完成轉生任務&#xff09;&#xff0c;部分地圖需額外滿足神魔點數&#xff08;如黑暗之森需神魔全2&#…

信創系統圖形界面開發指南:技術選擇與實踐詳解

信創系統圖形界面開發指南&#xff1a;技術選擇與實踐詳解 &#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&…

【人臉去遮擋前沿】三階段級聯引導學習如何突破真實場景遮擋難題?

一、現實痛點:當人臉被遮擋,AI “認臉” 有多難? 你是否遇到過這樣的場景? 中考體育測試:2025 年天津泰達街中考考場要求考生 “臉部無遮擋” 才能通過人臉識別入場,戴口罩、帽子的學生需現場調整發型。智能門鎖:奇景光電在 CES 2025 推出的 WiseEye 掌靜脈模塊,通過掌…

c++線程的創建

c 11 線程編程實戰 目錄 c 11 線程編程實戰1&#xff0c;線程的創建1.1 傳入無參函數1.2 傳入有參函數1.3 傳入類內部函數1.4 lambda表達式 1&#xff0c;線程的創建 1.1 傳入無參函數 //傳入函數&#xff0c;創建線程 void ThreadMain() {//獲取線程IDstd::thread::id thi…

人工智能數學基礎(六):數理統計

數理統計是人工智能中數據處理和分析的核心工具&#xff0c;它通過收集、分析數據來推斷總體特征和規律。本文將系統介紹數理統計的基本概念和方法&#xff0c;并結合 Python 實例&#xff0c;幫助讀者更好地理解和應用這些知識。資源綁定附上完整資源供讀者參考學習&#xff0…

解決STM32待機模式無法下載程序問題的深度探討

在現代嵌入式系統開發中&#xff0c;STM32系列微控制器因其高性能、低功耗和豐富的外設資源而廣受歡迎。然而&#xff0c;開發者在使用STM32時可能會遇到一個問題&#xff1a;當微控制器進入待機模式后&#xff0c;無法通過調試接口&#xff08;如SWD或JTAG&#xff09;下載程序…

C#擴展方法與Lambda表達式基本用法

C# 擴展方法與 Lambda 表達式詳解 一、擴展方法詳解 1. 基本概念 ??擴展方法??允許為現有類型"添加"方法&#xff0c;而無需修改原始類型或創建派生類型。 ??定義條件??&#xff1a; 必須在靜態類中定義方法本身必須是靜態的第一個參數使用this修飾符指…

C#規避內存泄漏的編碼方法

C#規避內存泄漏的編碼方法 內存泄漏是C#開發中常見的問題&#xff0c;盡管.NET有垃圾回收機制(GC)&#xff0c;但不當的編碼實踐仍可能導致內存無法被及時回收。以下是系統性的規避內存泄漏的方法&#xff1a; 一、理解內存泄漏的常見原因 ??未釋放的事件訂閱????靜態…

React 后臺管理系統

這是一個基于 React TypeScript Ant Design 開發的向明天系統前端項目。 git倉庫地址 技術棧 React 19TypeScriptAnt Design 5.xRedux ToolkitReact RouterAxiosLess 環境要求 Node.js (推薦使用最新LTS版本)npm 或 yarn 安裝步驟 克隆項目到本地 git clone [https://…

第九節:文件操作

理論知識 文件的基本概念&#xff1a;文件是存儲數據的基本單位&#xff0c;在 Linux 系統中&#xff0c;一切皆文件。文件可以是文本文件、二進制文件、設備文件等。文件的創建&#xff1a;使用 touch 命令可以創建一個新的空文件。如果文件已經存在&#xff0c;則更新文件的…

2025-03 機器人等級考試四級理論真題 4級

1 2025年蛇年春晚&#xff0c;節目《秧BOT》機器人舞蹈表演節目點燃了全國觀眾的熱情&#xff0c;請問參加節目表演的機器人是由哪家公司研發&#xff1f;&#xff08; &#xff09; A.大疆 B.華為 C.優必選 D.宇樹科技 【參考答…

k8s平臺:手動部署Grafana

以下是一個可用于生產環境的 Kubernetes 部署 Grafana 的 YAML 文件。該配置包括 Deployment、Service、ConfigMap 和 PersistentVolumeClaim&#xff0c;確保 Grafana 的高可用性和數據持久化。 Grafana 生產部署 YAML 文件 ☆實操示例 cat grafana-deployment.yaml --- # …

農產品園區展示系統——仙盟創夢IDE開發

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>農業大數據平臺</title><style>* {margi…

每日Bug:(2)共享內存

對于整個系統而言&#xff0c;主存與CPU的資源都是有限的&#xff0c;隨著打開進程數量的增加&#xff0c;若是將所有進程運行所需的代碼/數據/棧/共享庫都存放在主存中&#xff0c;那么開啟一部分進程就可以將主存占用完。 虛擬內存就是解決以上問題的方法&#xff0c;使用虛…

C語言Makefile編寫與使用指南

Makefile 詳細指南&#xff1a;編寫與使用 Makefile 是 C/C 項目中常用的自動化構建工具&#xff0c;它定義了項目的編譯規則和依賴關系。下面我將詳細介紹 Makefile 的編寫和使用方法。 一、Makefile 基礎 1. 基本結構 一個典型的 Makefile 包含以下部分&#xff1a; mak…