本文主要是介绍Codeforces Round 924 (Div. 2)---->B. Equalize,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
总思路:首先我们做这题的时候有两个点一定要知道:
1.当数组中有重复元素的时候,只有其中的一个才能贡献一个相同元素,其他的都不行(因为是排列,一个数只出现一次),所以我们可以用使用去重函数。——>去重的两种方法
2.出现次数最多的元素,一定是 arr[i]数组中某个元素加上排列的某个值形成的。当然这个值我们是无法确定的,但是这个元素是加上元素的那个数而成的我们可以根据贪心思维求得。
3.这个数一定是加上排列中的1形成的,为什么呢?首先我们要知道当两个数之间的差距 大于 n (排列长度),是一定不会被凑出来的,所以当一个数加上1,那么这个差距是最小的,能拼凑出相同元素的个数也是最多的。
一,方法一:双指针
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;const int N=2e5+10;int arr[N];void Solved(){int n;cin>>n;for(int i=0;i<n;i++) cin>>arr[i];sort(arr,arr+n);int m=unique(arr,arr+n)-arr;int cnt=0;for(int i=0,j=0;i<m;i++){while(j<m&&arr[i]+1-arr[j]>n){j++;}cnt=max(cnt,i-j+1);}cout<<cnt<<endl;
}int main()
{int t;cin>>t;while(t--) {Solved();}return 0;
}
二,二分(思路和双指针一样,可能比双指针更好理解点)
1.代码:
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;const int N=2e5+10;int arr[N];void Solved(){int n;cin>>n;for(int i=0;i<n;i++) cin>>arr[i];sort(arr,arr+n);int m=unique(arr,arr+n)-arr;int cnt=0;for(int i=0;i<m;i++){int l=0,r=i;//二分模版while(l<r){int mid=(l+r)>>1;if(arr[i]+1-arr[mid]<=n) r=mid;else l=mid+1;}cnt=max(cnt,i-l+1);}cout<<cnt<<endl;}int main()
{int t;cin>>t;while(t--) {Solved();}return 0;
}
这篇关于Codeforces Round 924 (Div. 2)---->B. Equalize的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!