问题已经解决了!
问题已经解决了!
问题已经解决了!
问题已经解决了!
拿到测试数据后,发现是测试数据的问题,草(一种植物
下面是原问题,留待后人踩坑前来翻阅
我确认在进行求助前,已经尝试过了自己寻找答案并取得了一定的进展,但是不能完全解除自己的疑惑
经过测试,下面三段代码的区别只是对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]在不在静态区按理说应该并无区别呀, 但是它现在就是有区别