CSP-202309-2 坐標變換(其二)(模擬,c++,vector建二叉樹)

計算機軟件能力認證考試系統

問題描述

試題編號:202309-3
試題名稱:梯度求解
時間限制:1.0s
內存限制:512.0MB
問題描述:

背景
西西艾弗島運營公司近期在大力推廣智能化市政管理系統。這套系統是由西西艾弗島信息中心研發的。它的主要目的是,通過詳細評估島上各處的市政設施的狀況,來指導市政設施的維護和更新。這套系統的核心是一套智能化的傳感器網絡,它能夠自動地對島上的市政設施進行評估。對市政設施的維護是需要一定成本的,而年久失修的市政設施也可能給島上的居民造成損失。為了能夠平衡成本和收益,信息中心研發了一款數學模型,描述這些變量和損益之間的復雜數學關系。要想得到最優化的成本,就要依靠梯度下降算法來求解。

梯度下降算法中,求解函數在一點處對某一自變量的偏導數是十分重要的。小 C 負責實現這個功能,但是具體的技術實現,他還是一頭霧水,希望你來幫助他完成這個任務。

問題描述
設被求算的函數 u=f(x1,x2,…,xn),本題目要求你求出 u 對 xi 在 (a1,a2,…,an) 處的偏導數 ?u?xi(a1,a2,…,an)。

求算多元函數在一點處對某一自變量的偏導數的方法是:將函數的該自變量視為單一自變量,其余自變量認為是常數,運用一元函數求導的方法求出該偏導數表達式,再代入被求算的點的坐標即可。

例如,要求算 u=x1?x1?x2 對 x1 在 (1,2) 處的偏導數,可以將 x2 視為常數,依次應用求導公式。先應用乘法的求導公式:(x1?(x1?x2))′=x1′(x1?x2)+x1(x1?x2)′;再應用常數與變量相乘的求導公式,得到 x1′?x1?x2+x1?x2?x1′;最后應用公式 x′=1 得到 1?x1?x2+x1?x2?1。整理得 ?u?x1=2x2?x1。再代入 (1,2) 得到 ?u?x1(1,2)=4。

常見的求導公式有:

(是常數)c′=0 (c是常數)
x′=1
(u+v)′=u′+v′
(是常數)(cu)′=cu′ (c是常數)
(u?v)′=u′?v′
(uv)′=u′v+uv′
本題目中,你需要求解的函數 f 僅由常數、自變量和它們的加法、減法、乘法組成。且為程序識讀方便,函數表達式已經被整理為逆波蘭式(后綴表達式)的形式。例如,x1?x1?x2 的逆波蘭式為 x1 x1 * x2 *。逆波蘭式即為表達式樹的后序遍歷的結果。若要從逆波蘭式還原原始計算算式,可以按照這一方法進行:假設存在一個空棧 S,依次讀取逆波蘭式的每一個元素,若讀取到的是變量或常量,則將其壓入 S 中;若讀取到的是計算符號,則從 S 中取出兩個元素,進行相應運算,再將結果壓入 S 中。最后,若 S 中存在唯一的元素,則該表達式合法,其值即為該元素的值。例如對于逆波蘭式 x1 x1 * x2 *,按上述方法讀取,棧 S 的變化情況依次為(左側是棧底,右側是棧頂):

x1;
x1,x1;
(x1?x1);
(x1?x1),x2;
((x1?x1)?x2)。
輸入格式
從標準輸入讀入數據。

輸入的第一行是由空格分隔的兩個正整數 n、m,分別表示要求解函數中所含自變量的個數和要求解的偏導數的個數。

輸入的第二行是一個逆波蘭式,表示要求解的函數 f。其中,每個元素用一個空格分隔,每個元素可能是:

一個自變量 xi,用字符 x 后接一個正整數表示,表示第 i 個自變量,其中 i=1,2,…,n。例如,x1 表示第一個自變量 x1。
一個整常數,用十進制整數表示,其值在 ?105 到 105 之間。
一個運算符,用 + 表示加法,- 表示減法,* 表示乘法。
輸入的第三行到第 m+2 行,每行有 n+1 個用空格分隔的整數。其中第一個整數是要求偏導數的自變量的編號 i=1,2,…,n,隨后的整數是要求算的點的坐標 a1,a2,…,an。
輸入數據保證,對于所有的 i=1,2,…,n,ai 都在 ?105 到 105 之間。

輸出格式
輸出到標準輸出中。

輸出 m 行,每行一個整數,表示對應的偏導數對 109+7 取模的結果。即若結果為 y,輸出為 k,則保證存在整數 t,滿足 y=k+t?(109+7) 且 0≤k<109+7。

樣例 1 輸入
2 2
x1 x1 x1 * x2 + *
1 2 3
2 3 4

樣例 1 輸出
15
3

樣例 1 說明
讀取逆波蘭式,可得被求導的式子是:u=x1?(x1?x1+x2),即 u=x13+x1x2。

對 x1 求偏導得 ?u?x1=3x12+x2。代入 (2,3) 得到 ?u?x1(2,3)=15。

對 x2 求偏導得 ?u?x2=x1。代入 (3,4) 得到 ?u?x2(3,4)=3。

樣例 2 輸入
3 5
x2 x2 * x2 * 0 + -100000 -100000 * x2 * -
3 100000 100000 100000
2 0 0 0
2 0 -1 0
2 0 1 0
2 0 100000 0

樣例 2 輸出
0
70
73
73
999999867

樣例 2 說明
讀取逆波蘭式,可得被求導的式子是:u=x2?x2?x2+0?(?105)?(?105)?x2,即 u=x23?1010x2。

因為 u 中實際上不含 x1 和 x3,對這兩者求偏導結果均為 0。

對 x2 求偏導得 ?u?x2=3x22?1010。

評測用例規模與約定
測試點?? ?n?? ?m?? ?表達式的性質
1, 2?? ?=1?? ?≤100?? ?僅含有 1 個元素
3, 4?? ?=1?? ?≤100?? ?僅含有一個運算符
5, 6?? ?≤10?? ?≤100?? ?含有不超過 120 個元素,且不含乘法
7, 8?? ?≤10?? ?≤100?? ?含有不超過 120 個元素
9, 10?? ?≤100?? ?≤100?? ?含有不超過 120 個元素
提示
C++ 中可以使用 std::getline(std::cin, str) 讀入字符串直到行尾。

當計算整數 n 對 M 的模時,若 n 為負數,需要注意將結果調整至區間 [0,M) 內。

解析:

參考來源:第31次CCF計算機軟件能力認證 - ~Lanly~ - 博客園 (cnblogs.com)

從題目中可以看逆波蘭式就是表達樹的后序遍歷,所以我們可以利用二叉樹的遞歸遍歷進行求解。

同時,我們可以利用vector向量建立二叉樹,用鏈表也行,但是會比較麻煩。

具體請看代碼:

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
using namespace std;
typedef long long LL;
#define CH 1
#define CONST 2
#define OP 3
const int mod = 1e9 + 7;
int n, m;
vector<int>lc;
vector<int>rc;
vector<int>info;
vector<int>kind;
stack<int>stk;
vector<int>a(200);
// 定義遞歸函數 solve,計算表達式樹節點的值和導數
pair<int, int> solve(int u, int x) {if (kind[u] == CH) {return pair<int, int>{a[info[u]], (info[u] == x)};}else if (kind[u] == CONST) {return pair<int, int>{info[u], 0};}else {auto lans = solve(lc[u], x), rans = solve(rc[u], x);int sum = 0, dsum = 0;if (info[u] == '+') {sum = lans.first + rans.first;dsum = lans.second + rans.second;}else if (info[u] == '-') {sum = lans.first - rans.first;dsum = lans.second - rans.second;}else {sum = 1ll*lans.first * rans.first % mod;dsum = (1ll*lans.first * rans.second%mod + 1ll*lans.second * rans.first%mod);//1ll 是一種常見的編碼技巧,用于將數字字面量轉換為長長整型(long long)類型。}sum = (sum % mod + mod) % mod;dsum = (dsum % mod + mod) % mod;return pair<int, int>{sum, dsum};}
}
int main() {cin >> n >> m;string s;getline(cin, s);getline(cin, s);int cnt = 0;istringstream q(s);//q 是一個 istringstream 對象,用于從字符串中讀取數據。//getline(qwq, s, ' ') 是 C++ 中的輸入流操作,//用于從輸入流 qwq 中讀取一行(以換行符 '\n' 結束的一行)并存儲到字符串 s 中,//直到遇到指定的分隔符(在這里是空格 ' ')為止。while (getline(q, s, ' ')) {if (s.size() == 1 && (s[0] == '+' || s[0] == '*' || s[0] == '-')) {int rson = stk.top();stk.pop();int lson = stk.top();stk.pop();lc.push_back(lson);rc.push_back(rson);info.push_back(s[0]);kind.push_back(OP);stk.push(cnt);cnt++;}else if (s[0] == 'x') {int x = stoi(s.substr(1));//subStr 是從第二個字符開始的子串,stoi 將其轉換為整數。x--;lc.push_back(-1);rc.push_back(-1);info.push_back(x);kind.push_back(CH);stk.push(cnt);cnt++;}else {int x = stoi(s);lc.push_back(-1);rc.push_back(-1);info.push_back(x);kind.push_back(CONST);stk.push(cnt);cnt++;}}int root = stk.top();// 處理每個查詢for (int i = 1; i <= m; i++) {int x;cin >> x;x--;//由于我們是從0開始記錄,所以這里要-1for (int j = 0; j < n; j++) {cin >> a[j];}cout << solve(root, x).second << endl;}return 0;
}

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

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

相關文章

DAPP開發【11】IPFS星際文件管理系統【簡介,實踐看12】

IPFS&#xff08;InterPlanetary File System&#xff09;是一個點對點的分布式文件系統&#xff0c;旨在創建一個更快速、更安全和更開放的 Web。它不同于傳統的 HTTP 協議&#xff0c;因為它不需要使用一個固定的地址來訪問文件&#xff0c;而是通過一個基于內容尋址的系統&a…

HeartBeat監控Mysql狀態

目錄 一、概述 二、 安裝部署 三、配置 四、啟動服務 五、查看數據 一、概述 使用heartbeat可以實現在kibana界面對 Mysql 服務存活狀態進行觀察&#xff0c;如有必要&#xff0c;也可在服務宕機后立即向相關人員發送郵件通知 二、 安裝部署 參照章節&#xff1a;監控組件…

S32K324 UDS Bootloader開發-下位機篇-App軟件開發

文章目錄 前言ld文件修改增加編譯文件CAN發送與接收發送接收函數調用UDS協議增加校驗算法Hex文件合并總結前言 本文參考NXP官網的S32K3 Bootloader,移植實現UDS刷寫功能。本文是APP軟件的修改 本文參考NXP官網的S32K324 UBL,其中有一些Bug,也有一些和上位機不兼容的地方,在本…

每日一博 - 圖解5種Cache策略

文章目錄 概述讀策略Cache AsideRead Through 寫策略Write ThroughWrite AroundWrite Back 使用場景舉例 概述 緩存是在系統中存儲數據的臨時存儲器&#xff0c;用于提高訪問速度。緩存策略定義了如何在緩存和主存之間管理數據 讀策略 Read data from the system: &#x1f5…

vue3原生方法滾動列表

效果圖 代碼 import { ref, onBeforeUnmount, onUnmounted } from "vue"; //定時器初始化 let timer ref(null); //ref綁定初始化 let roll ref(null); //等同于vue2中的beforeDestroy onBeforeUnmount(() > {//清除定時器clearTimeout(timer.value); }); //等同…

AGI時代探導開發的智能化落地之路:中國企業低代碼及無代碼應用價值報告V6

今天分享的AGI系列深度研究報告&#xff1a;《AGI時代探導開發的智能化落地之路&#xff1a;中國企業低代碼及無代碼應用價值報告V6》。 &#xff08;報告出品方&#xff1a;甲子光年智庫&#xff09; 報告共計&#xff1a;47頁 點擊添加圖片描述&#xff08;最多60個字&…

機器學習與人工智能:一場革命性的變革

機器學習與人工智能&#xff1a;一場革命性的變革 人工智能的概述什么是機器學習定義解釋 數據集結構機器學習應用場景 人工智能的概述 1956年8月&#xff0c;在美國漢諾斯小鎮寧靜的達特茅斯學院中&#xff0c;約翰麥卡錫&#xff08;John McCarthy&#xff09;、馬文閔斯基&…

數據鏈路層的作用和三個基本問題

目錄 一. 數據鏈路層的作用二. 數據鏈路層解決的三個問題2.1 數據鏈路和幀2.2 三個基本問題(重要)2.2.1 封裝成幀2.2.2 透明傳輸2.2.3 差錯檢測 \quad 一. 數據鏈路層的作用 \quad \quad \quad 光有鏈路不能傳輸數據, 還要加上協議, 這樣才是數據鏈路 數據鏈路層的作用就是負責…

RHEL8_Linux虛擬數據優化器VDO

本章主要介紹虛擬化數據優化器 什么是虛擬數據優化器VDO創建VDO設備以節約硬盤空間 1.了解什么是VDO VDO全稱是Virtual Data Optimize&#xff08;虛擬數據優化)&#xff0c;主要是為了節省硬盤空間。 現在假設有兩個文件file1和 file2&#xff0c;大小都是10G。file1和 fil…

.NET 材料檢測系統崩潰分析

Windbg 分析 1. 到底是哪里的崩潰 一直跟蹤我這個系列的朋友應該知道分析崩潰第一個命令就是 !analyze -v &#xff0c;讓windbg幫我們自動化異常分析。 0:033> !analyze -v CONTEXT: (.ecxr) rax00000039cccff2d7 rbx00000039c85fc2b0 rcx00000039cccff2d8 rdx000000000…

洛谷P3807 Lucas定理

傳送門&#xff1a; P3807 【模板】盧卡斯定理/Lucas 定理 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn)https://www.luogu.com.cn/problem/P3807題干&#xff1a; 給定整數n,m,p 的值&#xff0c;求出C&#xff08;nm&#xff0c;n&#xff09;?mod p 的值。 輸入數據保證…

5分鐘搞懂K8S Pod Terminating/Unknown故障排查

Kubernetes集群中的Pod有時候會進入Terminating或Unknown狀態&#xff0c;本文列舉了6種可能的原因&#xff0c;幫助我們排查這種現象。原文: K8s Troubleshooting — Pod in Terminating or Unknown Status 有時我們會看到K8S集群中的pod進入"Terminating"或"U…

每日一練【查找總價格為目標值的兩個商品】

一、題目描述 題目鏈接 購物車內的商品價格按照升序記錄于數組 price。請在購物車中找到兩個商品的價格總和剛好是 target。若存在多種情況&#xff0c;返回任一結果即可。 示例 1&#xff1a; 輸入&#xff1a;price [3, 9, 12, 15], target 18 輸出&#xff1a;[3,15] …

成都工業學院Web技術基礎(WEB)實驗一:HTML5排版標簽使用

寫在前面 1、基于2022級計算機大類實驗指導書 2、代碼僅提供參考&#xff0c;前端變化比較大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一樣 3、圖片和文字僅為示例&#xff0c;需要自行替換 4、如果代碼不滿足你的要求&#xff0c;請尋求其他的…

Python+AI實現AI繪畫

&#x1f517; 運行環境&#xff1a;Python &#x1f6a9; 撰寫作者&#xff1a;左手の明天 &#x1f947; 精選專欄&#xff1a;《python》 &#x1f525; 推薦專欄&#xff1a;《算法研究》 &#x1f510;#### 防偽水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

Gemini與GPT-4的巔峰對決:AI界的雙壁之戰

隨著人工智能技術的飛速發展&#xff0c;AI領域的競爭越來越激烈。在這個充滿挑戰與機遇的時代&#xff0c;兩個備受矚目的AI巨頭——Gemini Pro和GPT-4&#xff0c;成為了人們關注的焦點。這兩者都以其強大的功能和卓越的性能&#xff0c;引領著AI領域的發展潮流。本文將詳細介…

MyBatisX插件

MyBatisX插件 MyBatis-Plus為我們提供了強大的mapper和service模板&#xff0c;能夠大大的提高開發效率。 但是在真正開發過程中&#xff0c;MyBatis-Plus并不能為我們解決所有問題&#xff0c;例如一些復雜的SQL&#xff0c;多表聯查&#xff0c;我們就需要自己去編寫代碼和SQ…

connection error;reply-code=503;unknown exchange type ‘x-delayed-message‘

錯誤原因 這個錯誤表明你的 RabbitMQ 服務器不認識交換機類型 “x-delayed-message”&#xff0c;這通常是因為你的 RabbitMQ 服務器沒有啟用 rabbitmq_delayed_message_exchange 插件&#xff0c;或者插件版本與你的 RabbitMQ 服務器不兼容。 解決方法 啟用 RabbitMQ 延遲隊…

JAVA安全之Spring參數綁定漏洞CVE-2022-22965

前言 在介紹這個漏洞前&#xff0c;介紹下在spring下的參數綁定 在Spring框架中&#xff0c;參數綁定是一種常見的操作&#xff0c;用于將HTTP請求的參數值綁定到Controller方法的參數上。下面是一些示例&#xff0c;展示了如何在Spring中進行參數綁定&#xff1a; 示例1&am…

2024年C語言基礎知識入門來了,一文搞定C語言基礎知識!

一、C語言基礎知識入門 c語言基礎知識入門一經出現就以其功能豐富、表達能力強、靈活方便、應用面廣等特點迅速在全世界普及和推廣。C語言不但執行效率高而且可移植性好&#xff0c;可以用來開發應用軟件、驅動、操作系統等&#xff0c;2024年C語言基礎知識入門大全。C語言基礎…