这道题带给我的启发是:深入思考问题 用数学表达题目的核心
#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;
}