其他分享
首页 > 其他分享> > 期末预测之安全指数(202012-2/CCF)———附带思路和完整代码

期末预测之安全指数(202012-2/CCF)———附带思路和完整代码

作者:互联网

文章目录

0 效果

在这里插入图片描述

在这里插入图片描述
此为暴力求解的算法,没有通过200~105的数据测试。

1 题目

在这里插入图片描述
在这里插入图片描述
样例1输入
6
0 0
1 0
1 1
3 1
5 1
7 1
样例1输出
3
在这里插入图片描述
样例2输入
8
5 1
5 0
5 0
2 1
3 0
4 0
100000000 1
1 0
样例2输出
100000000
在这里插入图片描述

2 思路

2.1 暴力求解

用vector存储输入的每个y和result值,待全部输入完成后,使用二重循环遍历依次遍历每个元素

由于进行的双重for循环,时间复杂度为O(m2),当m特别大如105时,程序会运行超时

2.2 简化

由第一种解法观察发现,计算一个数字对应的预测正确次数 = 到小于当前数字前一个的0的累加和 + (到最大数字为止1的累加和 - 到小于当前数字前一个数字的1的累加和)
例如:
6
0 0
1 0
1 1
3 1
5 1
7 1
对应的解析为

数字0的个数1的个数预测正确次数
0100 + 4 = 4
1211 + (4 - 0) = 5
3222 + (4 - 1) = 5
5232 + (4 - 2) = 4
7242 + (4 - 3) = 1

由此得思路为:

3 代码

3.1 暴力求解

#include <cstdio>
#include <vector>

int main(){
    int  m, y, result;
    scanf("%d", &m);
    std::vector<int> yVec, resVec;
    for(int i = 0; i < m;i++){
        scanf("%d%d", &y, &result);
        yVec.push_back(y);
        resVec.push_back(result);
    }
    int ans = yVec[0], maxCnt =  0;
    for(std::vector<int>::iterator i = yVec.begin(); i != yVec.end(); i++){
       int tempCnt = 0;
       for(int j = 0; j < m; j++){
           if((yVec[j] >= (*i) && resVec[j] == 1) || (yVec[j] < (*i) && resVec[j] == 0)){
               tempCnt++;
           }
       }
       if((tempCnt > maxCnt) || (tempCnt == maxCnt && (*i) > ans)){
            maxCnt = tempCnt;
            ans = (*i);
        }
    }
//    for(auto i: yVec){
//        int index = 0, tempCnt = 0;
//        for(auto y: yVec){
//            if((y >= i && resVec[index] == 1) || (y < i && resVec[index] == 0)){
//                tempCnt++;
//            }
//            index++;
//        }
//        if((tempCnt > maxCnt) || (tempCnt == maxCnt && i > ans)){
//            maxCnt = tempCnt;
//            ans = i;
//        }
//    }
    printf("%d", ans);


    return 0;
}

3.2 简化

#include <cstdio>
#include <vector>
#include <algorithm>
#include <map>
#include <cmath>
#include <iterator>
using std::vector;
using  std::sort;
using  std::map;
using   std::advance;

typedef struct Data{
  int y, result;
  Data(int _y, int _result):y(_y),result(_result){}
  Data(){}
}Data;

typedef struct Statistics{
    int zeroNum;
    int oneNum;
    Statistics():zeroNum(0),oneNum(0){}
}Statistics;

bool cmp(const Data& d1, const Data& d2){
    if(d1.y < d2.y) return true;
    else return false;
}


int main(){
    int m,  y, result;
    vector<Data> data;
    scanf("%d", &m);
    //存储数值
    for (int i = 0; i < m; ++i) {
        scanf("%d%d", &y, &result);
        data.push_back(Data(y, result));
    }
    //排序
    sort(data.begin(), data.end(), cmp);
    //统计截止到每个元素的0和1的个数
    map<int, Statistics> mp;
    for(int i = 0;i < m;i++){
        if(i != 0){
            mp[data[i].y].zeroNum = mp[data[i-1].y].zeroNum;
            mp[data[i].y].oneNum = mp[data[i - 1].y].oneNum;
        }
        if(data[i].result == 0){
            mp[data[i].y].zeroNum++;
        }else{
            mp[data[i].y].oneNum++;
        }
    }
//    for(int i = 0;i < m;i++){
//        printf("%d zeroNum:%d oneNum:%d\n", data[i].y,  mp[data[i].y].zeroNum ,mp[data[i].y].oneNum);
//    }
//特殊处理第一个元素,
    int ans = data[0].y, maxCnt = mp[data[m -1].y].oneNum, tempCnt = 0;
   // printf("%d  oneNum:%d\n", data[0].y,  mp[data[m -1].y].oneNum);
   //使用双指针法,第一个指针iter指向要计算元素的前一个元素,iter2指向当前计算的元素
    map<int,Statistics>::iterator iter = mp.begin(), iter2 = mp.begin();
    if(mp.size() > 1) advance(iter2, 1);
    for(; iter2 != mp.end();iter2++, iter++){
        tempCnt = iter->second.zeroNum + (mp[data[m -1].y].oneNum - iter->second.oneNum);
       // printf("%d zeroNum:%d oneNum:%d\n", iter2->first, iter->second.zeroNum, (mp[data[m -1].y].oneNum - iter->second.oneNum));
       //更新数值
        if(tempCnt >= maxCnt){
            maxCnt = tempCnt;
            ans = iter2->first;
        }
    }

    printf("%d", ans);

    return 0;
}
/*
6
0 0
1 0
1 1
3 1
5 1
7 1

 */

标签:附带,oneNum,tempCnt,int,mp,202012,CCF,data,result
来源: https://blog.csdn.net/qq_33375598/article/details/112132040