[已解决]求助-关于题目加加减减

问题已经解决了!
问题已经解决了!
问题已经解决了!
问题已经解决了!

拿到测试数据后,发现是测试数据的问题,草(一种植物

下面是原问题,留待后人踩坑前来翻阅

我确认在进行求助前,已经尝试过了自己寻找答案并取得了一定的进展,但是不能完全解除自己的疑惑

经过测试,下面三段代码的区别只是对n个数字的处理方式不同

题目

原题链接:E.加加减减
E. 减减加加

Description

给你一个数列,共N个数字 你可以对每个数字,做如下三种操作之一
1:将这个数字加1
2:将这个数字减去1
3:什么事也不做

最终希望在这个数列中,某个数字出现的次数越多越好,输出出现次数即可。

Format
Input

第一行给出N

第二行给出N个数字

N<=1e5,数字的权值在[0,1e5]之间.

Output

如题

Samples
输入数据 1

7
3 1 4 1 5 9 2

输出数据 1

4

Hint
将这个数列变成2 2 4 2 5 9 2

Limitation
1s, 102400KiB for each test case.

代码1

是我最开始我写的版本, 用t临时存放数字,将其获取后在cnt数组相应的t下标元素进行自增

不管怎么样都过不了样例10

//测试点10 Wrong answer
#include <stdio.h>

typedef long long ll;
ll cnt[100005];

// int a[100005];

int main(void) {
    int n;
    scanf("%d", &n);

    // int t = 0;
    int t = 0;
    int maxn = -99999;
    for (int i = 0;i < n; ++i) {
        scanf("%d", &t);
        // scanf("%d", &a[i]);
        cnt[t]++;
        // cnt[a[i]]++;

        maxn = t >= maxn ? t : maxn;
        // maxn = a[i] >= maxn ? a[i] : maxn;
    } 

    cnt[maxn+1] = 0;
    ll slice_sum = 0, max = cnt[0] + cnt[1]; //i = 0
    // for (int i = 1;i <= maxn; ++i) {
    for (int i = 1;i <= maxn; ++i) {
        slice_sum = 0;
        for (int j = -1;j <= 1; ++j)
            slice_sum += cnt[j + i];
        
        max = slice_sum>max?slice_sum:max;
    }

    printf("%lld", max);
    return 0;
}

代码二

我翻阅了ly的博客,看了他的题解,感觉思路也是大差不差, 就照着他的将我的一句句对应修改, 然后不再使用t存储数据,而是用了数组a

参考代码

原文链接: csdn-羚羊向未来

#include <iostream>
#include <map>
#include <algorithm>

using namespace std;
#define ll long long
int a[100005];
int main(){
    int n;
    cin>>n;
    map<int,int>m;
    for(int i=0;i<n;i++){
        cin>>a[i];
        m[a[i]]++;
    }
    // sort(a,a+n);
    int ans=0;
    for(int i=0;i<=100000;i++){
        ans=max(ans,m[i]+m[i-1]+m[i+1]);
    }
    cout<<ans;
    return 0;
}
我修改后的代码
//测试点10,段错误

#include <stdio.h>

typedef long long ll;
ll cnt[100005];

// int t = 0;

int main(void) {
    int a[100005];
    int n;
    scanf("%d", &n);

    // int t = 0;
    int maxn = -99999;
    for (int i = 0;i < n; ++i) {
        // scanf("%d", &t);
        scanf("%d", &a[i]);
        // cnt[t]++;
        cnt[a[i]]++;

        // maxn = t >= maxn ? t : maxn;
        maxn = a[i] >= maxn ? a[i] : maxn;
    } 

    cnt[maxn+1] = 0;
    ll slice_sum = 0, max = cnt[0] + cnt[1]; //i = 0
    // for (int i = 1;i <= maxn; ++i) {
    for (int i = 1;i <= maxn; ++i) {
        slice_sum = 0;
        for (int j = -1;j <= 1; ++j)
            slice_sum += cnt[j + i];
        
        max = slice_sum>max?slice_sum:max;
    }

    printf("%lld", max);
    return 0;
}

还是没有过

第三段代码

第二段代码还是没过, 经过逐语句对比替换测试,我发现将a数据放置在静态区就可以全过,嗯过是过了,可是为什么?

//ac,通过所有样例
#include <stdio.h>

typedef long long ll;
ll cnt[100005];

// int t = 0;

int a[100005];
int main(void) {
    int n;
    scanf("%d", &n);

    // int t = 0;
    int maxn = -99999;
    for (int i = 0;i < n; ++i) {
        // scanf("%d", &t);
        scanf("%d", &a[i]);
        // cnt[t]++;
        cnt[a[i]]++;

        // maxn = t >= maxn ? t : maxn;
        maxn = a[i] >= maxn ? a[i] : maxn;
    } 

    cnt[maxn+1] = 0;
    ll slice_sum = 0, max = cnt[0] + cnt[1]; //i = 0
    // for (int i = 1;i <= maxn; ++i) {
    for (int i = 1;i <= maxn; ++i) {
        slice_sum = 0;
        for (int j = -1;j <= 1; ++j)
            slice_sum += cnt[j + i];
        
        max = slice_sum>max?slice_sum:max;
    }

    printf("%lld", max);
    return 0;
}

我的探索历程

对拍

经过对拍脚本5000次测试,暂时没有发现两个程序有不一致的地方

so,why?

对于符合题目要求的范围 (0-1e5), 在合法范围内

a [ i ] , t a[i],t a[i],t 以及 a [ i ] a[i] a[i]在不在静态区按理说应该并无区别呀, 但是它现在就是有区别

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值