日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Scholomance Academy 读题训练,模拟(沈阳)

發布時間:2025/3/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scholomance Academy 读题训练,模拟(沈阳) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意 :

  • 給出n組,每組包含一個字符(+/-)和一個數值
  • 對于任意一個數值x,如果x大于θ\thetaθ且為正,為TP;x大于θ\thetaθ且為負,為FP;x小于θ\thetaθ且為正,為FN;小于θ\thetaθ且為負,為TN
  • 現定義TPR=TP/(TP+FN)TPR=TP/(TP+FN)TPR=TP/(TP+FN)FPR=FP/(TN+FP)FPR=FP/(TN+FP)FPR=FP/(TN+FP)
  • 可以發現TPR即所有字符為正的數值中屬于TP的數量,FPR…
  • 可以根據取不同θ\thetaθ時TPR和FPR的值畫出曲線,要求根據的ROC曲線,求出AUC(曲線下面積)

思路 :

  • AUC即取到FPR<=1的所有θ\thetaθ對應的TPR這條曲線下的面積,結合圖例(分段常數函數)是多個矩形的面積,由若干段TPR*FPR相加,現在的問題是不知道哪里是分界點
  • 發現橫縱坐標相乘TPR?deltaFPR=(TP?FP)/((TP+FN)?(TN+FP))TPR*deltaFPR=(TP*FP)/((TP+FN)*(TN+FP))TPR?deltaFPR=(TP?FP)/((TP+FN)?(TN+FP)),又發現分母是所有字符正乘所有字符負,也就是說分母永遠是常數,因此可以先將分子累加,最后除分母
  • 根據FPR的值從小到大(由定義公式推出θ\thetaθ從小到大)cmp函數是從小到大的,若值相同,’+'排在‘-’前,這樣得到的一組坐標,它的橫縱坐標都是遞增的(非嚴格遞增)),這樣就可以計算了
  • 將+和-的值分別放在兩個數組里,進行從小到大的cmp排序
  • a.end() - upper_bound(a.begin(), a.end(), b[i]) 返回大于b[i]的有幾個
#include <iostream> #include <algorithm> #include <cstring> #include <queue> #define debug(a) cout << #a << " = " << a << endl; #define x first #define y second using namespace std; typedef long long ll;const int N = 1e6 + 10;struct node {char op;int num; }a[N];int n;bool cmp(node a, node b) {if (a.num == b.num) // 如果數值相同則先出現符號為-的return a.op < b.op;return a.num < b.num; // 先出現數值小的 }int main() { // ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _ = 1; // cin >> _;while (_ -- ){scanf("%d", &n);getchar(); // 同下int po = 0, ne = 0; // 代表正負總個數for (int i = 1; i <= n; i ++ ){scanf("%c%d", &a[i].op, &a[i].num);getchar(); // 換行也是char,scanf不會自動去掉換行if (a[i].op == '+') po ++ ;else ne ++ ;}sort(a + 1, a + n + 1, cmp);double ans = 0, t = 1; // 乘積和 & TP*FP(>theta的正負乘積)for (int i = 1; i <= n; i ++ ){if (a[i].op == '-') ans += t / ne; // 如果符號是'-',說明出現轉折,乘積和(面積和)加上那部分else t = t - 1.0 / po; // 如果符號是'+',}printf("%.10lf\n", ans); // 誤差小于等于1e-9}return 0; }

題解二 :

  • 當theta變大時,tpr和fpr同時變大,注意到auc函數單調性(當r較大時 我們讓FPR盡量大 這樣可以讓θ盡量大 使得TPR變大),且為若干斜率為0的直線(當r在一段較小的區間內波動時 FPR不會變化 如果讓TPR盡量大 就令θ盡量大 此時TPR也不會變化),我們可以分割成一個個的矩形求面積,在遍歷的時候將函數分成TN+FP段,每一段長度為1/(tn+fp)
//#pragma GCC optimize(2)#include<bits/stdc++.h> //#define FAST ios::sync_with_stdio(false); cin.tie(0); #define int long long #define eps 1e-9using namespace std;const int MAXN = (int)1e6 + 5;struct Node {char op;int val; }a[MAXN];int n, TNFP, TPFN, TP, FP;bool cmp(Node& a, Node& b) {if(a.val == b.val) {if(b.op == '+') return false;if(a.op == '+') return true;}return a.val < b.val; }signed main() {cin >> n;for(int i = 1; i <= n; i++) {cin >> a[i].op >> a[i].val;if(a[i].op == '+') {TPFN++;} else {TNFP++;}}sort(a + 1, a + 1 + n, cmp);TP = TPFN, FP = 0;int tot = 0;for(int i = 1; i <= n; i++) {if(a[i].op == '+') { // 每遇到一個'+',tp就減少一個TP--;} else { // 為'-'時遇到轉折點,答案累加乘積(tp*fp)tot += TP;}}long double ans = 1.0 * tot / (TPFN * TNFP);printf("%.9Lf", ans);//cout << ans;return 0; }

總結

以上是生活随笔為你收集整理的Scholomance Academy 读题训练,模拟(沈阳)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。