hihocoder - [Offer收割]编程练习赛17
Posted zhang--yd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hihocoder - [Offer收割]编程练习赛17相关的知识,希望对你有一定的参考价值。
hihocoder - [Offer收割]编程练习赛17
题目1 : F1 Score
描述
小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
描述
给定一个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的主要内容,如果未能解决你的问题,请参考以下文章