CCFCSP-202012-2-期末預測之最佳閾值
阿新 • • 發佈:2021-02-11
只有70分,因為用了兩層迴圈的暴力解法,70%的資料量的200以內,其餘30%執行超時了。在網上看了點100分的解法,用字首和什麼的,看了會兒也沒看太懂,感覺為30分用那麼複雜的不值,剩餘的時間還不如在後面的題裡得點分。
#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
int m; //m組資料,m最大值為100000
int y[100000]; //m個同學的安全指數
int result[100000]; //m個同學 是否掛科,0掛,1不掛
int predict[ 100000]; //在某閾值下對m個同學的成績預測結果 0或1
int right_count[100000] = { 0 }; //每個閾值預測正確的總次數
int best_index; //最佳閾值對應是第幾個同學,即y[i]的i
int best_threshold; //最佳閾值,可能有多個,但是取最大的那個
int best_count; //最大的正確預測次數
cin >> m;
for (int i = 0; i < m; i++) {
cin >> y[i] >> result[i];
}
// 1、初始化資料,保證迴圈處理的統一性
best_index = 0; //第幾個
best_threshold = 0; //當前最佳閾值
best_count = 0; //當前最大正確預測次數
// 2、計算m個閾值的預測正確次數
// 3、求最大閾值
//外層迴圈:y[i]表示第i個閾值,也就是第i個同學的安全指數
for (int i = 0; i < m; i++) {
//內層迴圈:y[j]表示第j個同學的安全指數
for (int j = 0; j < m; j++) {
// 1、計算預測值
if (y[j] < y[i])
predict[j] = 0;
else
predict[j] = 1;
// 2、比較預測值與實際值,如果正確,更新預測正確的次數
if (predict[j] == result[j])
right_count[i]++;
}
// cout << "y[" <<i <<"]="<<y[i]<<"作為閾值時的最大預測正確次數:" << right_count[i] << endl;
//如果y[i]的正確預測次數比目前的best_threshold多,直接更新
if (right_count[i] > best_count) {
best_index = i;
best_threshold = y[best_index];
best_count = right_count[best_index];
}
//如果y[i]的正確預測次數 等於 目前的best_threshold,再比較y[i]與best_threshold的大小,取大的
else if (right_count[i] == best_count) {
if (y[i] > best_threshold) {
best_index = i;
best_threshold = y[best_index];
best_count = right_count[best_index];
}
}
else;
}
cout << best_threshold;
return 0;
}