第一思路:
该思路比较容易想到,枚举所有可能的阈值,再遍历所有人将预测成功的进行计数,最后不断更新最大值即可
#include<bits/stdc++.h> using namespace std; int m,ans,pre=-1; int y[100005]; bool result[100005]; bool predict(int y,int x){ return y>=x; } int main(){ cin>>m; for(int i=1;i<=m;i++){ cin>>y[i]>>result[i]; } for(int i=1;i<=m;i++){//遍历可能的阈值 int num=0,maybe=y[i]; for(int j=1;j<=m;j++){ num+=(predict(y[j],maybe)==result[j]); } if(num>=pre){ ans=maybe; pre=num; } } cout<<ans<<endl; return 0; }
第二思路:
想到可以使用前缀和来方便计算及格和不及格的人数,然后提前对数组的阈值进行排序,这样我们可以实现O(1)计算预测成功的人数
#include<bits/stdc++.h> using namespace std; int m,ans,win=-1; typedef struct Node{ int y,result; }; Node arr[100005]; int sum[100005];//前缀和数组 bool predict(int y,int x){ return y>=x; } bool cmp(Node node1,Node node2){ return node1.y<node2.y; } int main(){ cin>>m; for(int i=1;i<=m;i++){ cin>>arr[i].y>>arr[i].result; } sort(arr+1,arr+1+m,cmp); for(int i=1;i<=m;i++){ sum[i]=sum[i-1]+arr[i].result; } arr[0].y=-1;//初始化避免跳过了阈值为0的情况 for(int i=1;i<=m;i++){//遍历阈值 //在<当前阈值范围内预测成功个数为i-1-sum[i-1] //在>=当前阈值范围内预测成功个数为sum[m]-sum[i-1] int yuzhi=arr[i].y; if(yuzhi==arr[i-1].y){ continue;//重复出现的阈值只计算第一个 } int temp=(i-1-sum[i-1])+(sum[m]-sum[i-1]); // cout<<yuzhi<<" "<<temp<<endl; if(temp>=win){ ans=yuzhi; win=temp; } } cout<<ans<<endl; return 0; }
需要注意的是对于重复出现的阈值我们必须只计算第一个,因为如果对后续重复出现的阈值再计算,会导致计算结果出错,例如上面样例1中出现了两个1,如果对第二个1也进行上述计算会导致阈值为1时预测成功人数为6