天天看點

Codeforces Round #496 C. Summarize to the Power of Two

題意

給你組序列,你可以随意找出一個a[i] 和 一個a[j] 讓 a[i] + a[j]是2的次方,問你有幾個 a[i] 不滿足這個條件

思路

當時想的是無腦暴力一發,結果沒有逾時wa12,然後莫名放空自己,卡了一個小時 。。。到最後才發現,2的幂有30個 ,我寫的是 <30 應該寫成 <= 30 。。難受 ,思路就是 我先打一個2次幂的表,之後把我的a[i] 放到map裡,之後對于每一個a[i],我們和表裡的每一個數相減,看看得到的數是不是在map裡,就好了,需要注意的是 如果相減得到的數和我們的a[i]相等的話,我們要數map裡的數字要有兩個以上才行。

代碼:

#include <bits/stdc++.h>
using namespace std;
const int maxn =  + ;
int a[maxn];
int p[maxn];
vector<int>V;
map<int,int>M;
int cnt = ;
void init()
{
    for(int i =  ; i<= ; i++) p[i] = <<i; 
}
int main()
{
    int n;
    scanf("%d",&n);
    init();
    M.clear();
    for(int i =  ; i < n ; i++)
    {
        scanf("%d",&a[i]);
        if(!M.count(a[i]))
        {
            M[a[i]] = ;
        }
        else 
        {
            M[a[i]] ++;
        }
    }
    int ans = ;
    for(int i =  ; i < n ; i++)
    {
        int j;
        for(j =  ; j <=  ; j++)
        {
            int t = p[j] - a[i];
            if(t == a[i])
            {
                if(M[t]>=)
                {
                    break;
                }
            }
            else 
            {
                if(M[t])
                {
                    break;
                }
            }
        }
        if(j == )
        {
            ans++;
        } 

    }
    cout<<ans<<endl;    
}