0
点赞
收藏
分享

微信扫一扫

CSP202012-2 期末预测之最佳阈值满分解答

史值拥 2022-03-11 阅读 44

这道题带给我的启发是:深入思考问题 用数学表达题目的核心 

      

 

#include<iostream>
#include<algorithm>
using namespace std;
struct node {
	int index;
	int result;
	node() {
		index = 0;
		result = 0;
	}
};
bool cmp(const node temp1, const node temp2) {
    if (temp1.index > temp2.index) return false;
    else return true;
}
int main() {
	int num = 0;
	cin >> num;
	node* nodes = new node[num];
	for (int i = 0; i < num; i++) cin >> nodes[i].index >> nodes[i].result;
    sort(nodes, nodes + num, cmp);
	int final_answer = 0, count = 0, record = 0; //record用来记录每一次安全阈值的预测成功的次数 count用来记录最多的成功次数 
	int flag = nodes[0].index; 
	for (int i = 1; i <= num; i++) { 
		if (flag > nodes[i].index && nodes[i].result == 0)
			record++;
		if (flag <= nodes[i].index && nodes[i].result == 1)
			record++;
	}
	if (count >= record) {
		final_answer = flag;
		count = record;
	}
	for (int i = 1; i < num; i++) {
		if (nodes[i].index == flag) continue;
		for (int j = i-1; j >= 0; j--) { //这么做的原因是 我已经对所有的数据从大到小排好序 因此每一次更新flag 能对record的值产生影响的只有flag的前一个元素(根据传递性 比flag大或比flag小的数据都不会对record产生影响)
            if (nodes[j].index == flag && nodes[j].result == 0) record++;
            if (nodes[j].index == flag && nodes[j].result == 1) record--;
            if (nodes[j].index < flag) break;
		}
		if (record >= count) {
			final_answer = nodes[i].index;
			count = record;
		}
		flag = nodes[i].index; //更新flag
	}
	cout << final_answer;
	delete[]nodes;
	return 0;
}
举报

相关推荐

CSP 202012-2 期末预测

0 条评论