2022.2.26 学习 CSP 202012-2 期末预测之最佳阈值
解法一:
#include <bits/stdc++.h>
using namespace std;
const int MAX=1e5+5;
struct student
{
int y;
int result;
}s[MAX];
bool cmp(student a,student b)
{
return a.y<b.y;
}
int main()
{
std::ios::sync_with_stdio(false);
int m;
cin>>m;
set<int> num;
int res=0,maxn=0,best;
for(int i=1;i<=m;i++)
{
cin>>s[i].y>>s[i].result;
num.insert(s[i].y);
}
sort(s+1,s+m+1,cmp);
set<int>::iterator it=num.begin();
int flag=*it;
for(int i=1;i<=m;i++)
{
if(s[i].result==1)
res++;
}
maxn=max(res,maxn);
best=flag;
int index=1;
for(it++;it!=num.end();it++)
{
flag=*it;
while(s[index].y<flag)
{
if(s[index].result==0)
res++;
else
res--;
index++;
}
if(res>=maxn)
{
maxn=max(res,maxn);
best=flag;
}
}
cout<<best<<endl;
return 0;
}
解法二:
#include <bits/stdc++.h>
using namespace std;
const int MAX=1e5+5;
int sum0[MAX],sum1[MAX];
struct student
{
int y;
int result;
}s[MAX];
bool cmp(student a,student b)
{
if(a.y!=b.y)
{
return a.y<b.y;
}
else
{
return a.result>b.result;
}
}
int main()
{
std::ios::sync_with_stdio(false);
int m;
cin>>m;
set<int> num;
for(int i=1;i<=m;i++)
{
cin>>s[i].y>>s[i].result;
num.insert(s[i].y);
}
sort(s+1,s+1+m,cmp);
sum0[0]=sum0[1]=0;
for(int i=2;i<=m;i++)
{
if(s[i-1].result==0)
{
sum0[i]=sum0[i-1]+1;
}
else
{
sum0[i]=sum0[i-1];
}
}
sum1[m+1]=0;
for(int i=m;i>=1;i--)
{
if(s[i].result==1)
{
sum1[i]=sum1[i+1]+1;
}
else
{
sum1[i]=sum1[i+1];
}
}
int res=0,maxn=0,best;
for(int i=1;i<=m;i++)
{
res=sum0[i]+sum1[i];
if(res>=maxn)
{
maxn=max(res,maxn);
best=s[i].y;
}
}
cout<<best<<endl;
return 0;
}