• hihocoder


    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("%%
    ");
    	}
    	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
    ", ans );
    	}
    }
    

      

  • 相关阅读:
    爬虫示例
    S20_DAY23--课堂笔记
    python--常用模块之正则
    S20_DAY22--课堂笔记
    win10系统重装
    CCF 命令行选项
    CCF 任务调度
    CCF 出现次数最多的数
    CCF ISBN
    CCF 最大的矩形
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/6885332.html
Copyright © 2020-2023  润新知