题目
题目编号: 202012-2
题目名称: 期末预测之最佳阈值
时间限制: 1.0s
内存限制: 512.0MB
题目链接:202012-2-期末预测之最佳阈值
题目描述:
输入输出要求:
代码
暴力求解法
#include <iostream>
#include <algorithm>//排序头文件
using namespace std;
struct node
{
int y;//安全指数or阈值
int result;//是否挂科
int sum;
};
//排序规则
bool cmp1(node s1, node s2)
{
if(s1.sum!=s2.sum) return s1.sum>s2.sum;
return s1.y>s2.y;
}
int main()
{
int m;
cin>>m;
node s[m+1];
for(int i=0;i<m;i++)
{
cin>>s[i].y>>s[i].result;//输入
s[i].sum=0;//初始化
}
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
if(s[j].y>=s[i].y&&s[j].result==1) s[i].sum+=1;//大于等于该数的且不挂科的,预测正确sum+1
if(s[j].y<s[i].y&&s[j].result==0) s[i].sum+=1;//小于该数的且挂科的,正确sum+1
}
}
sort(s,s+m,cmp1);//排序
cout<<s[0].y;
return 0;
}
结果:会超时
优化
参考链接:CCF 2020-12-2 期末预测之最佳阈值,个人总结,适合新手,思路简单
#include <iostream>
#include <algorithm>//排序需求
using namespace std;
struct node
{
int y;//安全指数or阈值
int result;//是否挂科
};
//排序规则
bool cmp(node s1, node s2)
{
if(s1.y!=s2.y) return s1.y<s2.y;//先按照安全指数排序
return s1.result <s2.result;//如果安全指数一样,则按照是否挂科来排序
}
int main()
{
int m;
cin>>m;
node s[m];
int ones=0,zeros=0;
for(int i=0;i<m;i++)
{
cin>>s[i].y>>s[i].result;//输入
if(s[i].result==1) ones+=1;//此时的ones相当于最小的y的正确预测次数
}
int max,ans;
sort(s,s+m,cmp);
max=zeros+ones;//此时的max相当于s[0]的即最小的y正确预测次数
for(int i=1;i<m;i++)
{
if(s[i-1].result==0) zeros+=1;//前一个y预测正确,即result=0时,正确预测次数+1
else if(s[i-1].result==1)ones-=1;//前一个y预测失败,即result=1时,正确预测次数-1
int temp;
temp=zeros+ones;
if(s[i].y>s[i-1].y&&temp>=max)//选择大的预测次数并且避开了判断条件里需要y不一样
{
max=temp;
ans=s[i].y;
}
}
cout<<ans;
return 0;
}
结果
写在最后
自我学习笔记,仅供参考。