2020年12月csp认证期末预测之最佳阈值求助
本人萌新,编码水平大概只有小白水平。同时也是第一次在这边写博客,希望各位大神多多指教。
题目就不赘述了,详细的题目请参考链接:链接: link.
我自己写了一个代码,时间复杂度应该为O(n),不知道sort的时间复杂度, 但是最终结果却显示超时,只拿了90分。希望各位大神可以帮忙看看,能不能加以改进。(同时也希望能指导一下代码风格)
核心思想:后面一个预设阈值的正确次数为前面阈值的正确次数加上前面阈值挂科次数减去通过次数(当阈值升序排序时)
具体代码如下:
#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
using namespace std;
struct node{
int y; //y为安全指数
int num0 = 0; //num0挂科次数
int num1 = 0; //num1为通过次数
bool operator==(const int &b) //重载==用于find()
{
return y == b;
}
};
bool cmp(node a, node b) //用于sort
{
return a.y < b.y;
}
int main()
{
int n, max, maxi, num, sum;
cin >> n;
int *y = new int[n];
int *result = new int[n];
vector<node> flag; //存放预设阈值
vector<node>::iterator it;
for(int i = 0; i < n; i++)
cin >> y[i] >> result[i];
num = 0;
for(int i = 0; i < n; i++)
{
it = find(flag.begin(), flag.end(), y[i]); //查找这个阈值是否已经存在
if(it != flag.end()) //如果存在则对应的通过或者挂科数目加1
{
if(result[i])
{
it->num1++;
}
else
{
it->num0++;
}
}
else //如果不存在那么则将新的预设阈值存入flag中,并对应的通过或者挂科数目加1
{
node k;
k.y = y[i];
if(result[i])
{
k.num1++;
}
else
{
k.num0++;
}
flag.push_back(k);
num++;
}
}
sort(flag.begin(), flag.end(), cmp); //对预设阈值进行升序排序
max = 0; //正确次数的最大值
maxi = 0; //max对应的阈值
for(int i = 1; i < num; i++)
{
max += flag.at(i).num1; //先算出最小的预设阈值的正确次数
}
sum = max;
for(int i = 1; i < num; i++)//核心思想:后面一个预设阈值的正确次数为前面阈值的正确次数加上前面阈值挂科次数减去通过次数
{
sum = sum + flag[i - 1].num0 - flag[i - 1].num1;
if(sum >= max)
{
max = sum;
maxi = flag[i].y;
}
}
delete[] y;
delete[] result;
cout << maxi << endl;
return 0;
}
希望各位大佬可以多多指点我。让我猛烈的接受社会的毒打