题目就不列了,说说思路:
定义的参数含义如下:
1、定义一个node列表arr,里面包含y,实际结果result以及以这个y为阈值预测正确个数right
2、定义一个int列表sum用于存前缀和,前缀和下标从1开始算比较方便,因此定义数组大小多1
3、定义一个y_last记录前一个y,我们是排序后再操作的,而且每个阈值只计算一次,如果当前y跟y_last相等,那么就跳过当前y,因为这个y已经作为阈值被计算过了。
流程:
1、把输入的值存进arr,然后按照y从小到大对arr排序
2、按照排序后的arr计算result的前缀和sum,那么sum[i]的含义就是排序后的第1个y到第i个y之间的实际结果为1的个数。
3、按照题目的意思,假设现在以yi为阈值,那么小于yi预测结果都为0,大于等于yi的预测结果为1。又因为我们对y排序了,因此我们只需要知道这个yi之前实际为0的个数和这个yi及之后实际为1的个数
yi之前有i-1个数,其中实际为1的个数是sum[i-1],所以实际为0的个数:(i - 1)-sum[i-1]
yi及之后实际为1的个数是总的实际为1的个数减去yi之前为1的个数:sum[m] - sum[i-1]
两者相加即为正确个数
代码如下:
#include <algorithm>
#include <iostream>
using namespace std;
struct node
{
int y;
int result;
int right;
};
bool cmp(node s1, node s2)
{
return s1.y < s2.y;
}
node arr[100001] = {0,0,0};
int sum[100001] = {0};
int y_last = -1;
int main()
{
int m,max_y=0,max_right=0;
cin >> m;
for(int i=1; i<=m; i++)
cin >> arr[i].y >> arr[i].result;
sort(arr+1,arr+m+1,cmp);
//前缀和
for(int i=1; i<=m; i++)
sum[i] = arr[i].result + sum[i-1];
//正确个数为前面结果为0的个数 + 自己以及后面预测为1的个数
//如果y相同,只考虑第一个y
for(int i=1; i<=m; i++)
if(arr[i].y == y_last)
continue;
else{
arr[i].right = (i-1-sum[i-1]) + (sum[m]-sum[i-1]);
y_last = arr[i].y;
if(arr[i].right >= max_right){
max_right = arr[i].right;
max_y = arr[i].y;
}
}
cout << max_y;
}