吐槽蓝桥oj....

小明和完美序列

  最近做了这道题  给大家看看我一开始写的代码 这个时候刚学完二分和vector动态数组偶然看见了这个题然后就兴冲冲的用二分去写

上下两个代码一个用的是数组一个用的是vector其他的没啥区别

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N];
int main(){
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  int n;
  cin >> n;
  for(int i = 0;i < n;i ++){
    cin >> a[i];
  }
  sort(a,a + n);
  int s = 0;
  for(int i = 0;i < n;i ++){
    int g = 0;
    g = upper_bound(a,a + n,a[i]) - lower_bound(a,a + n,a[i]);
//g为数组中一个相同数字出现的次数
    if(g != a[i]){
      s ++;
    }
  }
  cout << s << '\n';
  return 0;
}


#include <bits/stdc++.h>
using namespace std;
int main(){
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  vector<int> arr;
  int n;
  cin >> n;
  for(int i = 0;i < n;i ++){
    arr.push_back(i);;
  }
  sort(arr.begin(),arr.end());
  int s = 0;
  for(int i = 0;i < n;i ++){
    int g = 0;
    g = upper_bound(arr.begin(),arr.end(),arr[i]) - lower_bound(arr.begin(),arr.end(),arr[i]);
    //g为数组中一个相同数字出现的次数
    if(g != arr[i]){
      s++;
    }
  }
  cout << s << '\n';
  return 0;
}

细心的同学们肯定看到了这个第二段代码写的什么东西....push_back(i)把 i一个一输入进去(当时对push_back这个玩意的语法还不熟悉 写数组遍历习惯了就这么写vector的遍历了)当时一提交还通过了俩案例

我心想哎哟我靠我这么牛呢 别人都用map 我没学map都写出来了 

之后我又提交了第一段的代码  结果

甚至通过了一大半的案例.....我当时真的觉得没有人比我更懂二分.....

标准题解(附代码注释)

#include <bits/stdc++.h> // 引入标准库的所有头文件

using namespace std; // 使用标准命名空间

typedef long long LL; // 定义长整型别名 LL

int main() // 程序入口
{
    int n; // 声明整型变量 n
    cin >> n; // 从标准输入读取 n 的值
    vector<int> a(n + 1); // 声明整型向量 a,大小为 n+1
    map<int, int> cnt; // 声明一个映射,键为整数,值为整数,用于统计每个数出现的次数

    // 循环读入 n 个整数,并更新 cnt 中每个数的出现次数
    for(int i = 1; i <= n; i ++) {
        cin >> a[i];
        cnt[a[i]] ++;
    }

    int ans = 0; // 初始化答案为 0

    // 遍历 cnt 中的每个键值对,键为数值,值为出现次数
    for(auto [x, y] : cnt) {
        // 如果某个数出现的次数大于该数值本身,说明需要删除多余的数
        if(y > x) 
            ans += y - x; // 删除多余的数,并将删除的数目累加到答案中
        // 如果某个数出现的次数小于该数值本身,说明所有该数都需要被删除
        else if(y < x) 
            ans += y; // 将该数出现的次数累加到答案中
    }

    cout << ans; // 输出答案
}

注意这里的cnt[a[i]]++可能第一次见的同学们不太理解 

咱们要把map去理解成数学中f(x)的形式 一个x值只能对应一个y值

此时相当于是把map中a[i]所对应的值取出并自增1 类比函数就是从(1,0)→(1,1)

漏洞指出

不知道我这样想的是不是个例吧 时候了解完审视了一遍自己的代码之后发现

1.s的值并不是累加而是重复赋值

在每一次的for循环里面都会进行一次重新的赋值而不是累次加起来

2.讨论范围受限

只讨论了如果测试数据中只有一个数字不满足完美序列要求的时候且这个数字一定在这一组数据的最后端的部分出现(因为第一点的s的值重复赋值进去了所以只取最后一次赋给s的值)

3.vector中添加元素使用错误

第一段代码中咱们看个笑话就行

正常来写应该是

#include <bits/stdc++.h>
using namespace std;
int main(){
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  vector<int> arr;
  int n;
  cin >> n;
  int a;  
  for(int i = 0;i < n;i ++){
     cin >> a;
     arr.push_back(a);;
  }

以上这样才是一个正常遍历去添加vector数组中的元素的步骤

对蓝桥OJ题目的碎碎念

测试数据未免太水了。。。。

现在看起来我当时就是在纯纯的瞎写还能通过这么多案例

有一种把你捧到天上之后之后摔碎的落差感。。。

当时我甚至还坐在电脑前思考这一系列的逻辑问题(十分坚定的相信自己的二分写法。。。)

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 蓝桥测试数据大小为60.06 MB。数据的大小通常是指数据占用的存储空间大小。在计算机中,数据以二进制的形式存储,每个二进制位(位)可以表示一个0或1,8个二进制位组成一个字节(Byte)。因此,60.06 MB表示数据占用了60.06兆字节的存储空间。 蓝桥测试数据大小为60.06 MB,换算成比特(Bits)为480.48兆比特(Mb)。MB(兆字节)和Mb(兆比特)之间的转换关系是:1兆字节(MB)= 8兆比特(Mb)。所以,60.06 MB乘以8得到480.48 Mb。 可以根据数据的大小来估计需要的存储空间和传输时间。传输时间取决于网络速度和文件大小。网络速度通常以比特每秒(bps)或兆比特每秒(Mbps)为单位。如果网络速度是1 Mbps,将60.06 MB转换成比特(Bits),并除以1 Mbps,可以得到传输该数据所需的时间。根据计算,以1 Mbps的传输速度传输60.06 MB的数据需要约480.48秒。 综上所述,蓝桥测试数据大小为60.06 MB,换算成比特为480.48 Mb。传输该数据所需的时间取决于网络速度,根据1 Mbps的传输速度估计,大约需要480.48秒。 ### 回答2: 蓝桥测试数据的大小为60.06MB。MB是存储容量的单位,表示兆字节。60.06MB大约相当于60060000字节。这个大小可以用来评估蓝桥测试数据的存储需求。根据文件类型和内容的不同,60.06MB可以容纳不同数量和大小的文件。例如,对于文本文件而言,这个大小可以容纳非常大的文本文件,大约相当于60000页的纸质文档。对于音频文件或视频文件而言,这个大小可能只能容纳数分钟的内容,具体取决于文件的编码和比特率。总的来说,60.06MB的大小在当前计算机及存储技术下不算特别大,但也不小。根据具体的使用场景和需要,我们可以相应地调整存储设备的容量,以便满足对蓝桥测试数据的存储和传输需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值