首页 > 技术文章 > hihocoder Contest

dxy1993 2017-05-21 15:01 原文

[Offer收割]编程练习赛17

链接:http://hihocoder.com/contests/past

A.F1 Score

思路:f1指标是机器学习中的一个指标,具体公式可见周志华《机器学习》一书

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n;
 9     int tp, fp, fn, tn;
10     char a, b;
11     
12     tp = fp = fn = tn = 0;
13     cin >> n;
14     while (n--)
15     {
16         cin >> a >> b;
17         if (a == '+' && b == '+')
18             tp++;
19         else if (a == '-' && b == '+')
20             fp++;
21         else if (a == '+' && b == '-')
22             fn++;
23         else if (a == '-' && b == '-')
24             tn++;
25         else
26             ;
27     }
28     
29     printf("%.2lf%\n", 200.0 * tp / (2.0 * tp + fn + fp));
30     
31     return 0;
32 }
View Code:

B.数组重排2

思路:这道题很有意思,跟百度春招的题目很像,那个是插到右边最后一个,这个是插到左边第一个,所以排序后从有往左扫,有几个位置发生了变化就是多少次

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int n;
10     int count = 0;
11 
12     cin >> n;
13     vector<int> nums(n);
14     vector<int> num(n);
15     for (int i = 0; i < n; i++)
16     {
17         cin >> nums[i];
18         num[i] = nums[i];
19     }
20 
21     sort(nums.begin(), nums.end());
22     int j = n - 1;
23     for (int i = n - 1; i >= 0; i--)
24     {
25         if (nums[j] == num[i])
26             j--;
27         else
28             count++;
29     }
30     cout << count << endl;
31 
32     return 0;
33 }
View Code:

C.逆序对

思路:这个是很经典的问题了,计算逆序对只需要计算它前边的数字比它大的有多少个就好了,线段树树状数组模板题

(注意:线段树树状数组都是从id为1开始,0会陷入死循环)

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 const int N = 100005;
 6 int v[N];
 7 int nums[N];
 8 int n;
 9 
10 int lowbit(int x)
11 {
12     return x & (-x);
13 }
14 
15 void insert(int id)
16 {
17     for (int i = id; i <= n; i += lowbit(i))
18         v[i]++;
19 }
20 
21 int query(int id)
22 {
23     long long sum = 0;
24     while (id > 0)
25     {
26         sum += v[id];
27         id -= lowbit(id);
28     }
29     return sum;
30 }
31 
32 int main()
33 {
34     long long sum = 0;
35     
36     cin >> n;
37     for (int i = 0; i < n; i++)
38         cin >> nums[i];
39     for (int i = n - 1; i >= 0; i--)
40     {
41         sum += query(nums[i]);
42         insert(nums[i]);
43     }
44     cout << sum << endl;
45     
46     return 0;
47 }
View Code:BIT(Back)
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 const long long N = 100005;
 6 long long v[N];
 7 long long n;
 8 
 9 long long lowbit(long long x)
10 {
11     return x & (-x);
12 }
13 
14 void insert(long long id)
15 {
16     for (long long i = id; i <= n; i += lowbit(i))
17         v[i]++;
18 }
19 
20 long long query(long long id)
21 {
22     if (id <= 0)
23         return 0;
24 
25     long long sum = 0;
26     while (id > 0)
27     {
28         sum += v[id];
29         id -= lowbit(id);
30     }
31     return sum;
32 }
33 
34 int main()
35 {
36     long long sum = 0;
37     long long num;
38 
39     cin >> n;
40     for (long long i = 0; i < n; i++)
41     {
42         cin >> num;
43         sum += query(n) - query(num);
44         insert(num);
45     }
46     cout << sum << endl;
47 
48     return 0;
49 }
View Code:BIT
 1 #include <iostream>
 2 #include <string>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 
 8 using namespace std;
 9 
10 #define N 100005
11 #define lson (id<<1)
12 #define rson ((id<<1)|1)
13 #define mid  ((l+r)>>1)
14 
15 long long tree[4*N];
16 
17 void push_up(int id)
18 {
19     tree[id]=tree[lson]+tree[rson];
20 }
21 
22 void build(int id,int l,int r)
23 {
24     if(l==r)
25     {
26         tree[id]=0;
27         return ;
28     }
29     build(lson,l,mid);
30     build(rson,mid+1,r);
31     push_up(id);
32 }
33 
34 void ins(int id,int l,int r,int tt)
35 {
36     if(l==r)
37     {
38         tree[id]=1;
39         return ;
40     }
41     if(tt<=mid)
42         ins(lson,l,mid,tt);
43     else
44         ins(rson,mid+1,r,tt);
45     push_up(id);
46 }
47 
48 
49 int query(int id,int l,int r,int ql,int qr)
50 {
51     if(ql<=l&&r<=qr)
52     {
53         return tree[id];
54     }
55 
56     long long m=0;
57     if(ql<=mid)
58         m+=query(lson,l,mid,ql,qr);
59     if(mid+1<=qr)
60         m+=query(rson,mid+1,r,ql,qr);
61     return m;
62 }
63 
64 int main()
65 {
66     int t;
67     int i,j;
68     long long sum;
69     int num;
70 
71 
72     sum=0;
73     cin >> t;
74     build(1,1,t);
75 
76     for(i=1;i<=t;i++)
77     {
78         scanf("%d",&num);
79         sum+=query(1,1,t,num + 1, t);
80         ins(1,1,t,num);
81     }
82     cout<<sum<<endl;
83 
84     return 0;
85 }
Code:Segment Tree

 

(总结:主要还是一些小问题:C题int卡了好几次,改成long long立马就过了,还是经验不够啊,继续加油吧!)

推荐阅读