CCF202012-2期末预测之最佳阈值

#include <bits/stdc++.h>
using namespace std;
/*
思路:用暴力双循环最多70分
1.用一层循环,排序,前缀相加,后缀相加
 
*/
typedef struct data
{
	int y;//存储y 
	int res;//存储result 
	int res0;//存储小于等于当前y值的0的个数 
	int res1;//存储大于等于当前y值的0的个数 
	int ans;//结果数 
}Data;
bool comp1(Data d1,Data d2)//起初排序法1 
{
	if(d1.y!=d2.y)
	  return d1.y<d2.y;
	else
	  return d1.res<d2.res;
}
bool comp2(Data d1,Data d2)//最终排序法2 
{
	if(d1.ans!=d2.ans)
	{
		return d1.ans<d2.ans;
	}
	else
	{
		return d1.y<d2.y;
	}
}
int main() 
{
	int m;
	cin>>m;
	int y,res;
    vector<Data> arr;
    for(int i=0;i<m;i++)
    {
    	cin>>y>>res;
    	Data t;
    	t.y=y;
    	t.res=res;
    	if(res==1)
    	{
    		t.res0=0;
    		t.res1=1;
		}
		else
		{
			t.res0=1;
    		t.res1=0;
		}
		arr.push_back(t);
	}
	sort(arr.begin(),arr.end(),comp1);
	for(int i=1;i<arr.size();i++)//前缀相加 
	{
		arr[i].res0=arr[i-1].res0+arr[i].res0;
	}
	for(int i=arr.size()-2;i>=0;i--)//后缀相加 
	{
		arr[i].res1=arr[i+1].res1+arr[i].res1;
	}
	arr[0].ans=arr[0].res1;//第一个元素值为res1 
	for(int i=1;i<arr.size();i++)
	{
		if(arr[i].res==0)//减去等于0的情况 
		  arr[i].ans=arr[i].res0+arr[i].res1-1;
		else
		  arr[i].ans=arr[i].res0+arr[i].res1;
		if(arr[i].y==arr[i-1].y)//多个y值相等的,排完序后,只和第一个有关 
		  arr[i].ans=arr[i-1].ans;
	}
	sort(arr.begin(),arr.end(),comp2);
	cout<<arr[arr.size()-1].y<<endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值