CSP202012-2 期末预测之最佳阈值

 避免双重for循环(超时)

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 const int m=100000;
 6 struct node 
 7 {
 8     int data, result, chance;
 9 }student[m];
10 bool cmp(node a, node b)
11 {
12     if (a.data == b.data)
13     {
14         return a.result > b.result;
15     }
16     else
17     {
18         return a.data < b.data;
19     }
20 }
21 int main(void)
22 {
23     int n;
24     cin >> n;
25     for (int i = 0; i < n; i++)
26     {
27         cin >> student[i].data >> student[i].result;
28         student[i].chance = 0;
29     }
30     sort(student, student + n, cmp);
31     //找出最大阈值准确率
32     for (int i = 0; i < n - 1; i++)
33     {
34         if (student[i].result == 0)
35         {
36             student[n - 1].chance++;
37         }
38     }
39     if (student[n - 1].result == 1)
40     {
41         student[n - 1].chance++;
42     }
43     //获取前一个阈值的准确率
44     for (int i = n - 1; i >= 0; i--)
45     {
46         student[i].chance = student[i + 1].chance;
47         if (student[i].result == 1)
48         {
49             student[i].chance++;
50         }
51         else
52         {
53             student[i].chance--;
54         }
55     }
56     //去重
57     for (int i = 0; i < n - 1; i++)
58     {
59         if (student[i].data == student[i + 1].data)
60         {
61             student[i + 1].chance = student[i].chance;
62         }
63     }
64     //找到阈值
65     int t = student[0].chance;
66     int max;
67     for (int i = 0; i < n; i++)
68     {
69         if (t <= student[i].chance)
70         {
71             t = student[i].chance;
72             max = student[i].data;
73         }
74     }
75     
76         cout << max;
77     return 0;
78 }    
表 1 vector 容器的成员函数
函数成员函数功能
begin() 返回指向容器中第一个元素的迭代器。
end() 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
rbegin() 返回指向最后一个元素的迭代器。
rend() 返回指向第一个元素所在位置前一个位置的迭代器。
cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin() 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend() 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
size() 返回实际元素个数。
max_size() 返回元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。
resize() 改变实际元素的个数。
capacity() 返回当前容量。
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
reserve() 增加容器的容量。
shrink _to_fit() 将内存减少到等于当前元素实际所使用的大小。
operator[ ] 重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。
at() 使用经过边界检查的索引访问元素。
front() 返回第一个元素的引用。
back() 返回最后一个元素的引用。
data() 返回指向容器中第一个元素的指针。
assign() 用新元素替换原有内容。
push_back() 在序列的尾部添加一个元素。
pop_back() 移出序列尾部的元素。
insert() 在指定的位置插入一个或多个元素。
erase() 移出一个元素或一段元素。
clear() 移出所有的元素,容器大小变为 0。
swap() 交换两个容器的所有元素。
emplace() 在指定的位置直接生成一个元素。
emplace_back() 在序列尾部生成一个元素。

sort函数

函数声明:

复制代码
#include <algorithm>
 
template< class RandomIt >
void sort( RandomIt first, RandomIt last );
 
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
复制代码

形式:sort(first_pointer,first_pointer+n,cmp)

参数解释: 第一个参数是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。第二个参数相对较好理解,即首地址加上数组的长度n(代表尾地址的下一地址)。最后一个参数是比较函数的名称(自定义函数cmp),这个比较函数可以不写,即第三个参数可以缺省,这样sort会默认按数组升序排序

简单例子:对数组A的0~n-1元素进行升序排序,只要写sort(A,A+n)即可;对于向量V也一样,sort(v.begin(),v.end())即可。

来击个掌啊,拉亚斯特!

 

参考:

http://c.biancheng.net/view/6749.html

https://www.cnblogs.com/AlvinZH/p/6784862.html

https://blog.csdn.net/weixin_45693289/article/details/115877445?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.control&spm=1001.2101.3001.4242

原文地址:https://www.cnblogs.com/qingdaodaozhu/p/15207303.html