hihocoder Contest
链接: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 }
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 }
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 }
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 }
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 }
(总结:主要还是一些小问题:C题int卡了好几次,改成long long立马就过了,还是经验不够啊,继续加油吧!)