2018暑假集训Problem Archive #1G题题解和感悟

G题

题目大意

题目链接

给你一个大小为n的数组,对于数组中的任意一个数,如果除开这个数,在数组中能找到某个数使得两个数之和是2的d次方,那么就保留这个数,否则删除,求删除数的个数

分析

在数组中任意两数之和肯定不会超过最大的两个数之和,所以我就找到仅次于最大两个数之和的2的d次方的数m,对于数组中的每个数a,m不断除以2,看m-a这个数在数组中是否存在,如果存在的话就保留这个数,否则删除这个数,但这道题有个坑就是a=m-a的时候,这时候a的个数必须大于等于2才满足条件。数组中元素的个数为1时肯定不满足条件,所以就单独判断,直接输出1。

代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <map>
#define MAX_N 120000+3
long long num[MAX_N];
using namespace std;
bool cmp(int a,int b)
{
    return a>b;
}
int main(int argc, char const *argv[])
{
    int cnt=0,number;
    long long mid,mid1=1;
    map<long long ,int>pq;
    memset(num,0,sizeof(num));
    scanf("%d",&number);
    for(int i=0;i<number;i++)
    {
        scanf("%lld",&num[i]);
        if(!pq.count(num[i]))
            pq[num[i]]=0;
        pq[num[i]]++;
    }
    sort(num,num+number,cmp);
    if(number==1)
    {
        cout<<"1";
        return 0;
    }
    mid=num[0]+num[1];
    for(int i=1;i,mid1<=mid;i++)
    {
        mid1*=2;
    }
    mid1/=2;
    for(int i=0;i<number;i++)
    {
        int flag=0;
        for(long long j=mid1;j>=2;j/=2)
        {
            if((j-num[i]==num[i])&&(pq[num[i]]>1))
            {
                flag=1;          
                break;
            }
            else if((j-num[i]!=num[i])&&(pq[j-num[i]]>=1))
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
            cnt++;
    }
    cout<<cnt;
    return 0;
}

总结

这道题想到用2的d次方来减去数组中的某个数,再来找数组中是否有这个数是关键,如果用循环来遍历的话,很可能会超时。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,457评论 0 2
  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    医学工程与科学园地阅读 1,254评论 0 1
  • 第1章 第一个C程序第2章 C语言基础第3章 变量和数据类型第4章 顺序结构程序设计第5章 条件结构程序设计第6章...
    小狮子365阅读 10,773评论 3 71
  • 没有能力支持自己的决策。对生活缺少决心。 没有一个圆心,所以转起来都是散的。 想要更纤瘦也更有力的体魄,所以运动。...
    蒋羽燃阅读 290评论 0 0
  • 是否 多一点风的吹浮 就能燃起风筝的激情? 如是 我愿化身为风 只为浮你飞舞 虽一秒无悔 是否 多一点雨的滋润 就...
    震血封侯阅读 207评论 0 6