CCF2020122-期末预测之最_佳阈值

这个题思路也比较简单,利用两次sort函数进行排序,定义两个不同的cmp函数;
但是在确定每个安全指数的预测正确次数(ceita[i].sum)时,使用两次for循环会直接超时,然后就把它改成代码中的一大段while代码,Debug了很长时间才通过:
主要是找到ceita[i].sum的规律,当ceita[i].y逐渐递减(无重复),如示例一,会有如下规律
1. ceita[1].sum可以直接遍历求出;
2. 若ceita[i].result == 1,则ceita[i].result = ceita[i-1].result + 1;
3. 若ceita[i].result == 0,则ceita[i].result = ceita[i-1].result - 1;

可恶的是,如果有重复的ceita[i].y,那么

  1. 接下来的几个安全指数的result都会影响当前的sum
    while (ceita[i].y == ceita[j].y )
  2. 并且这些相同的安全指数共用同一个sum值;
    while(i < j - 1)
    写代码前先分好类就会好写很多。
#include<bits/stdc++.h>

using namespace std;
struct Ceita{
	int y;
	int result;
	int sum;
};

bool cmp1(Ceita a,Ceita b){
	return a.y  > b.y;
}

bool cmp2(Ceita a,Ceita b){
	if(a.sum == b.sum) return a.y >b.y ;
	else return a.sum > b.sum;
}

int main(){
	int m;
	scanf("%d",&m);
	Ceita ceita[m];
	for(int i = 0; i < m; i++){
		scanf("%d %d",&ceita[i].y,&ceita[i].result);
		ceita[i].sum =0;
	}
	sort(ceita,ceita+m,cmp1);
	for (int j = 0;j < m; j++){
		if((ceita[j].y  < ceita[0].y  && ceita[j].result  == 0 )||(ceita[j].y  >= ceita[0].y  && ceita[j].result  == 1 )){
			ceita[0].sum ++;
		}
	}
	int i = 0;
	int j = 1;
	while(i < m && j < m){
		j = i + 1 ;
		while (ceita[i].y == ceita[j].y ){
			if(j == i + 1){
				if(ceita[i].result == 1){
					ceita[i].sum = ceita[i-1].sum + 1;
				}else{
					ceita[i].sum = ceita[i-1].sum - 1;
				}
			}
			if(ceita[j].result == 1){
				ceita[i].sum ++;
			}else{
				ceita[i].sum --;
			}
			j++;
		}
		while(i < j - 1){
			ceita[++i].sum = ceita[i-1].sum;
		} 
		i++;
		if(ceita[i].result == 1){
			ceita[i].sum = ceita[i-1].sum + 1;
		}else{
			ceita[i].sum = ceita[i-1].sum - 1;
		}
	
	}	
	sort(ceita,ceita+m,cmp2);
	printf("%d",ceita[0].y);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值