蒟蒻第一次打挑战赛过了签到题(太好了太好了!)
最开始想用一个数组下标为另一个数组来计数,但是发现好像不行,因为会越界
比如这样
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; }