202012 CCF试题

202012-1 期末预测之安全指数

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

// #define debug

int main(){
    #ifdef debug
        freopen("test.in", "r", stdin); 
    #endif
    int n,w,s;
    cin>>n;
    ll sum=0;
    for(int i=0;i<n;++i){
        cin>>w>>s;
        sum += w*s;
        // cout<<sum<<endl;
    }
    cout << ((sum > 0)?sum:0);
}

202012-2 期末预测之最佳阈值

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+5 ; 

// #define debug

struct Predict{
    int y;
    int r;
    int n0; // 统计0的个数
    int n1; // 统计1的个数
    Predict(int y=0,int r=0,int n0=0,int n1=0):y(y),r(r),n0(n0),n1(n1){}
    void setn(int n0,int n1){
        this->n0 = n0;
        this->n1 = n1;
    }
};


bool cmp(const Predict& a, const Predict& b)
{
	return a.y < b.y; //从大到小排序
}

Predict pred[MAXN];

/*
根据题目大致意思,先统计每个数(会重复出现)标记为0,1的个数,然后给定一个数,求小于这个数标记0的个数和大于等于标记为1的数
相当于分成两段,求左边,右边的累加值,对于累加可以用前缀和来做
故:先排序,去重,求前缀和,求结果

*/
int main(){
    #ifdef debug
        // freopen("test.in", "r", stdin); // 3
        freopen("test1.in", "r", stdin); // 100000000
        // freopen("test.out","w", stdout);
    #endif
    int m,tmp=1,result = 0,maxr=0;
    cin>>m;
    for(int i=1;i<=m;++i){
        cin>>pred[i].y>>pred[i].r;
        if(pred[i].r==1) {
            pred[i].setn(0,1);
        } else {
            pred[i].setn(1,0);
        }
    }
    // m++;
    sort(pred+1,pred+m+1,cmp);
     // 去重
    for(int i=2;i<=m;++i) {
        if(pred[i].y==pred[i-1].y){
            pred[tmp].n1 += pred[i].n1;
            pred[tmp].n0 += pred[i].n0;
        } else {
            pred[++tmp].y =  pred[i].y;
            pred[tmp].n1 = pred[i].n1;
            pred[tmp].n0 = pred[i].n0;
        }
    }
    m = tmp;
    for(int i=1;i<=m;++i){
        pred[i].n0 += pred[i-1].n0;
        pred[i].n1 += pred[i-1].n1;
    }
    for (int i=1;i<=m;++i){
        tmp = pred[i-1].n0 + pred[m].n1 - pred[i-1].n1; // 重复的数据
        // cout<<tmp<<endl;
        if (tmp>=maxr) {
            maxr = tmp;
            result = pred[i].y;
        }
    }
    cout<<result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值