hihocoder - [Offer收割]编程练习赛17

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 );
	}
}

  

时间: 2024-12-05 15:37:33

hihocoder - [Offer收割]编程练习赛17的相关文章

hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x值是多少.这里还要再辅助一个val[k]表示处理到当前情况只错了k次的最小值是多少因为改变的不止是和弦还有初始值,可以看一下代码理解一下. #include <iostream> #include <cstring> #include <cstdio> #include &

hihocoder offer收割编程练习赛13 D 骑士游历

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const ll mod = 1e9 + 7; 11 12 ll n, x, y;

hihocoder offer收割编程练习赛12 C 矩形分割

思路: 模拟,深搜. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 using namespace std; 5 6 const int dx[4] = { 0, 1, 0, -1 }; 7 const int dy[4] = { -1, 0, 1, 0 }; 8 9 int n, m, cnt = 0; 10 int a[305][305]; 11 bool vis[305][3

hihocoder offer收割编程练习赛12 D 寻找最大值

思路: 可能数据太水了,随便乱搞就过了. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 typedef long long ll; 6 7 int a[100005], n; 8 9 int main() 10 { 11 int t; 12 cin >> t; 13 while (t--) 14 { 15 ll max

hihocoder offer收割编程练习赛12 A 歌德巴赫猜想

思路: 枚举. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 const int MAX_N = 1000005; 7 8 int prime[MAX_N]; 9 bool is_prime[MAX_N + 1]; 10 11 int init(int n) 12 { 13 int p = 0; 14 for (int i =

HiHoCoder [Offer收割]编程练习赛6 C. 图像算子(高斯消元小数版)

传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在图像处理的技术中,经常会用到算子与图像进行卷积运算,从而达到平滑图像或是查找边界的效 果. 假设原图为 H×W 的矩阵 A,算子矩阵为 D×D 的矩阵 Op ,则处理后的矩阵 B 大小为 (H?D+1)×(W?D+1).其中: B[i][j]=∑(A[i?1+dx][j?1+dy]?Op[dx][dy])|(dx=1..D,dy=1..D),1≤i≤H?D+1,1≤j≤W?D+1 给定矩阵 A 和 B ,以及

hihocoder offer收割编程练习赛11 A hiho字符串

思路: 我用的尺取. 注意题目描述为恰好2个'h',1个'i',1个'o'. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 7 const int INF = 0x3f3f3f3f; 8 9 int ch[100005], ci[100005], co[100005]; 10 1

hihocoder offer收割编程练习赛11 B 物品价值

思路: 状态压缩 + dp. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int INF = 0x3f3f3f3f; 8 9 int t, n, m, s; 10 int V[1005], S[1005], dp[1005][(1 << 11) +

hihocoder offer收割编程练习赛11 C 岛屿3

思路: 并查集的应用. 实现: 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 bool a[1005][1005]; 6 int n, x, y; 7 int par[1000005]; 8 int ran[1000005]; 9 int dx[4] = { 1, 0, -1, 0 }; 10 int dy[4] = { 0, 1, 0, -1 }; 11 12 void init(int