hihocoder - [Offer收割]編程練習賽17
阿新 • • 發佈:2017-05-21
ios 最大值 namespace 機器學習 precision 作者 算法 int blog
hihocoder - [Offer收割]編程練習賽17
題目1 : F1 Score
時間限制:10000ms 單點時限:1000ms 內存限制:256MB描述
小Hi和他的小夥伴們一起寫了很多代碼。時間一久有些代碼究竟是不是自己寫的,小Hi也分辨不出來了。
於是他實現了一個分類算法,希望用機器學習實現自動分類。
為了評價這個分類算法的優劣,他選出了N份有標記的代碼作測試集,並決定用F1 Score作為評價標準。
給出N份代碼的實際作者是不是小Hi以及分類算法預測的結果,請你計算F1 Score。
輸入
第一行包含一個整數N。(1 <= N <= 1000)
以下N行每行包含兩個字符(+或-)。第一個字符代表這份代碼的實際作者是不是小Hi(+代表是,-代表不是),第二個代表預測的作者是不是小Hi(+代表是,-代表不是)。
輸出
一個百分數,X%,代表答案,X保留兩位小數。
- 樣例輸入
-
4 + + + - - + - -
- 樣例輸出
-
50.00%
計算 f1-score, 看來機器學習都開始影響OI領域了。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> using namespace std; int main(){ char ch1, ch2; int n; double tp, fn, fp, tn, precision, recall, ans; while( cin >> n ){ tp = 0.; fn = 0.; fp = 0.; tn = 0.; for(int i=0; i<n; ++i){ cin >> ch1 >> ch2; if(ch1 == ‘+‘ && ch2 == ‘+‘){ tp += 1.; }else if(ch1 == ‘+‘ && ch2 == ‘-‘){ fn += 1.; }else if(ch1 == ‘-‘ && ch2 == ‘+‘){ fp += 1.; }else if(ch1 == ‘-‘ && ch2 == ‘-‘){ tn += 1.; } } if( abs(tp + fp ) <= 1e-6){ precision = 1; } else { precision = tp/(tp + fp); } if( abs(tp + fn) <= 1e-6 ){ recall = 1; }else{ recall = tp/(tp + fn); } if( abs(precision + recall) <= 1e-6){ ans = 200.0 * precision * recall; }else{ ans = 200.0 * precision * recall/(precision + recall); } printf("%.2f", ans ); printf("%%\n"); } return 0; }
題目2 : 數組重排2
時間限制:10000ms 單點時限:1000ms 內存限制:256MB描述
給定一個1-N的排列A1, A2, ... AN,每次操作小Hi可以選擇一個數,把它放到數組的最左邊。
請計算小Hi最少進行幾次操作就能使得新數組是遞增排列的。
輸入
第一行包含一個整數N。
第二行包含N個兩兩不同整數A1, A2, ... AN。(1 <= Ai <= N)
對於60%的數據 1 <= N <= 20
對於100%的數據 1 <= N <= 100000
輸出
一個整數代表答案
- 樣例輸入
-
5 2 3 1 4 5
- 樣例輸出
-
1
掃一遍原數組,看不合格的數字的數量(指的是需要往前調的); 同時記錄需要前調的最大值,記錄了最大值之後,從成序列的數組開始掃,直到數組的開頭大於最大值。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 100000 + 10; int n, maxv, num[MAXN], stack[MAXN]; int main(){ freopen("in.txt", "r", stdin); int j, cur, maxv, ans; while(scanf("%d", &n) != EOF){ for(int i=0; i<n; ++i){ scanf("%d", &num[i]); } j = 0; cur = num[0]; stack[j++] = num[0]; maxv = 0; ans = 0; for(int i=1; i<n; ++i){ if(num[i] > cur){ cur = num[i]; stack[j++] = num[i]; }else{ maxv = max(maxv, num[i]); ans++; } } for(int i=0; i<j; ++i){ if(stack[i] < maxv){ ans++; } } printf("%d\n", ans ); } }
hihocoder - [Offer收割]編程練習賽17