蒟蒻第一次打挑战赛过了签到题(太好了太好了!)
最开始想用一个数组下标为另一个数组来计数,但是发现好像不行,因为会越界
比如这样
b[a[i]]++;
因为n<= 100000,而数据范围是到了1e9;
N = 100010,所以当初是开的100010的数组,像上面这样必定越界,就这样wa了两发
然后思索一下,改成了下面这种,判断
a[i]是否与a[i+1]相等的形式,然后用数字相同就cnt不用加一,数字不同cnt就+1,
用cnt来作为b数组的下标,同样达到计算的目的。
自己的AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 100010;
long long int a[N],b[N];
int n;
int main()
{
cin>>n;
for(int i = 0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
// for(int i = 0;i<n;i++)
// {
// cout<<a[i]<<" ";
// }
// cout<<endl;
int cnt = 0;
for(int i = 0;i<n;i++)
{
if(a[i]==a[i+1])
b[cnt]++;//b数组存储的是a数组中数字出现的次数
else
{
b[cnt]++;
cnt++;
}
}
cnt = 0;
long long int max_number = 0;
for(int i = 0;i<n;i++)
{
if(a[i]==a[i+1])
max_number = max(a[i]*b[cnt],max_number);
else
{
max_number = max(a[i]*b[cnt],max_number);
cnt++;
}
}
cout<<max_number;
}看了别人的题解,发现真的可以像这样b[a[i]]++的感觉来写,不过要用map
尝试一下(搜了一下map和auto用法打的)
别人的AC代码:
算法参照这个代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=47509767
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const int N = 100010;
map<ll,ll>m;
int n;
int main()
{
cin>>n;
int a[n];
for(int i = 0;i<n;i++)
{
cin>>a[i];
m[a[i]]++;
}
long long int sum = 0;
for(auto [x,y]:m)
{
sum=max(sum,x*y);
}
cout<<sum;
}
京公网安备 11010502036488号