期末预测之安全指数
问题
分数*权重,之和sum,sum大于0 则为 安全指数为sum,sum小于等于0,则安全指数等于0.
#include <iostream>
using namespace std;
int main(){
int n;
int w, score;
int sum = 0;
cin >> n;
for(int i = 0; i < n ; i++){
cin >> w >> score;
sum += w * score;
}
if(sum > 0) cout << sum <<endl;
else cout << 0 << endl;
return 0;
}
期末预测之最佳阈值
问题
给定若干数据,(阈值,及格与否),扫描所有的数据对,看选择哪个阈值的时候,所有的数据判断及格与否的结果与实际情况最符合,得分最高。(小于阈值的都不及格,大于等于都及格)。得分相同的,选较大的阈值。
思路
拿着每一个阈值,扫描所有数据对,判断得分,记录最高分,以及最大阈值。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int m;
cin >> m;
vector<vector<int> > a(m,vector<int>(2));
int y, result;
for(int i = 0; i < m; i++) {
cin >> a[i][0] >> a[i][1];
}
int score, max = 0, thetha = 0;
for(int i = 0; i < m; i++) {
score = 0;
for(int j = 0; j < m; j++) {
if((a[j][0] < a[i][0] && a[j][1] == 0) || (a[j][0] >= a[i][0] && a[j][1] == 1)) {
score++;
}
}
if(score == max && a[i][0] > thetha) {
thetha = a[i][0];
} else if(score > max) {
thetha = a[i][0];
max = score;
}
}
cout << thetha << endl;
return 0;
}
但是70分,超时了,意料之中。
原本有一个思路是,及格的一个数组,不及格的一个数组,然后都排序,这样确定某个阈值在数组中的位置就可以很快的计算出得分,但是因为有相同数据的存在,给判断位置带来阻碍,这个思路没有实现出来。
优秀思路
看了几个博主的思路,这个博主的好理解一些
CSP-期末预测之最佳阈值
将数据按照阈值y进行排序,题目要求每个阈值的得分,此时就变成了,求每个阈值左侧不及格的个数,和右侧及格的个数。因为y已经是从小到大的降序了。
博主还进行了,对相同y值进行跳过的操作,很厉害。
誊写博主的代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Score {
int y;
int result;
};
bool cmp(Score a, Score b){
return a.y < b.y;
//升序排列,小于为真
}
int main() {
int m;
cin >> m;
vector<Score> S;
int x0 = 0;//0总数
int x1 = 0;//1总数
Score a;
for(int i = 0; i < m; i++) {
cin >> a.y >> a.result;
S.push_back(a);
if(a.result)
x1++;
else x0++;
}
sort(S.begin(), S.end(), cmp);//升序排列
int p = 0, k = 0;//最高分,以及最大阈值
int sum0 = 0, sum1 = 1;//记录0,1数量的累加
for(int i = 0; i < m; i++){
int r = sum0 + x1 - sum1;//当前阈值的对应的正确次数
int j;
for( j = i; j < m && S[i].y == S[j].y; j++){//重复的只处理一次
if(S[j].result){
sum1++;
}
else sum0++;
}
i = j -1; //多个重复的,更新i值,跳过
if( r >= p){
p = r;
k = S[i].y;
}
}
cout << k << endl;
return 0;
}
get
想到了排序,但思路太复杂,直接计数0 ,1个数累加就好,按照y值升序之后,每个y值的得分就是,当前有无分,加上左侧0 的个数和右侧1得个数,0,1 的值还都可以累加。
对于自定义的排序
//排序的头文件
#include <algorithm>
sort(start,end)
//默认升序,可以自定义排序方法
//对于自定义的数据类型,要自己定义排序函数
struct Score {
int y;
int result;
};
bool cmp(Score a, Score b){
return a.y < b.y;
//小于为真,升序排列
}
sort(S.begin(), S.end(), cmp);//升序排列