期末预测之安全指数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n, sum = 0;
    cin>>n;
    while(n--){
        int s, w;
        cin>>s>>w;
        sum += (s*w);
    }
    int ans = max(0, sum);
    cout<<ans;
    return 0;
}
1
2
3
4
5
6
7
8
n = int(input())
sum = 0
for i in range(0, n):
    s, w = map(int, input().split())
    sum = sum + s * w
ans = max(0, sum)

print(ans)

期末预测之最佳阈值

关键:巧妙的将计数转变为前缀和问题 问题的关键在于如何快速的统计每一个阈值预测正确的个数? Y 总的方法是采用前缀和的方法来统计个数,如何将分散的数据转变为可以用前缀和的数据呢,就是按照阈值对数据进行排序。这样的效果就是阈值 i 预测正确的个数就是在 i 前的数据的预测结果为 0 的个数加上在 i 后数据预测结果为 1 的个数。 那么我们维护两个前缀和数组 s1 和 s0,s1 [i]表示 i 前(包括 i)的数据中 1 的个数,s0 [i]同理。那么对于数据 i 对应的阈值来说,预测正确的个数就是 s1 [m] - s1 [i - 1] + s0[i - 1]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int, int>PII;
const int N = 100010;
PII p[N];
int s[2][N];

int main(){
    int m;
    cin>>m;
    for(int i = 1; i <= m; i ++){
        cin>>p[i].x>>p[i].y;
    }
    sort(p + 1, p + m + 1); // 排序,目的是为了方便使用前缀和算法
    
    for(int i = 0; i < 2; i ++){
        for(int j = 1; j <= m; j ++){
            s[i][j] = s[i][j - 1] + (p[j].y == i); //维护前缀和数组
        }
    }
    int res , cnt = -1;
    for(int i = 1; i <= m; i ++){
        int t = s[0][i - 1] + s[1][m] - s[1][i - 1];
        if(t >= cnt) cnt = t, res = p[i].x;
        while(i + 1 <= m && p[i].x == p[i + 1].x) i++; //因为x(阈值)有相同的值,那么计算该阈值的正确预测个数,用的应该是最后出现的一个阈值对应的前缀和
    }
    cout<<res;
    return 0;
}