codeforces cf 521(div3) E题
生活随笔
收集整理的這篇文章主要介紹了
codeforces cf 521(div3) E题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本題讓我重視到對lower_bound這個函數不是特別會用。
lower_bound(int * ,int *,int )
第一個參數是數組首地址,由于c++語言的特殊性,傳入第一個參數可以是數組首地址+i,表示從數組第i個元素查找(對于下標從1開始的數組)
第二個參數是數組末位+1,這里可以把數組最后一位想象成INF,從頭開始,如果發現哪一位大于等于要查找的數字就返回哪一位的地址。
第三個參數是要查找的數字。
然后這道題把所有數字離散化存入一個桶里從小到大排序
然后從第一位到最后一位暴力枚舉
1每次都要枚舉每一個小于等于這一位上的數字,
2對于枚舉的每個數字,每次用lower_bound查找這一位數字后面的所有數字里面第一個大于等于這個數字的數。
3然后把數字乘二,位置移到查找到的位置,
直到位置超出數組總數后更新答案。
#include<bits/stdc++.h> using namespace std; int a[200010]; int aa[200010]; int b[200010]; int cnt[200010]; int tot; int main() {int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);//將a[i]離散化sort(a+1,a+n+1);aa[++tot]=a[1];for(int i=2;i<=n;i++){if(a[i]!=a[i-1]){aa[++tot]=a[i]; //去重,tot是數組中有幾個不同的數字 }}for(int i=1;i<=n;i++){b[i]=lower_bound(aa+1,aa+tot+1,a[i])-aa;//lower_bound只對有序數組有效 }//b[i]里面存了離散化數組//統計b[i]中有多少每個數字出現的個數 for(int i=1;i<=n;i++){cnt[b[i]]++;//cnt有tot個數字 }sort(cnt+1,cnt+tot+1);int res=0;for(int i=1;i<=tot;i++){int pos=i;for(int num=1;num<=cnt[pos];num++){int now=0;int tmp=pos;int num1=num;while(tmp<=tot){now+=num1;tmp=lower_bound(cnt+tmp+1,cnt+tot+1,num1*2)-cnt;num1*=2;}res=max(res,now);}}printf("%d\n",res); }
轉載于:https://www.cnblogs.com/lishengkangshidatiancai/p/9978073.html
總結
以上是生活随笔為你收集整理的codeforces cf 521(div3) E题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 敏捷冲刺四
- 下一篇: Kotlin中?和!!的区别