zoukankan      html  css  js  c++  java
  • Luogu P2326 AKN's PPAP【按位贪心】

    题目描述

    “I have a pen,I have an apple.Eh,Apple-Pen!.

    I have a pen,I have pineapple.En,Pineapple-Pen!

    Apple-Pen,Pineapple-Pen.Eh,Pen-Pineapple-Apple-Pen!”

    Akn最近中毒于一首音乐,于是他买来了一堆苹果来学习这首音乐。Akn发现,只要边唱这首歌,边做把两个完整的苹果碰在一起的动作,两个苹果就会融合成一个新的大苹果,但是大苹果却不能再融合,因为他的细胞内部结构已经改变。Akn还发现,当两个苹果融合的时候,苹果的质量会发生一些玄妙的改变,就是与运算(a&b)。但是,最近他的同学找他要一个苹果吃,akn出于好心,准备把他学习ppap用的苹果融合成的大苹果给同学吃,好让同学一起中毒于ppap,而且akn还想让大苹果的质量最大,那么请问akn能给同学吃的苹果质量最大是多少?

    输入输出格式

    输入格式:

    第一行包含一个整数T,表示数据组数

    接下来T组数据,每组数据第一行包含一个整数n,表示n个苹果

    第二行包含n个整数wi,表示第i个小苹果重wi kg

    输出格式:

    每组数据输出一行一个整数大苹果最大的质量,注意格式,Case #x: ans,case和#间有空格,:和ans之间有空格

    输入输出样例

    输入样例#1: 
    3
    4
    1 3 5 7
    10
    32 54 21 52 14 25 92 75 14 27
    21
    1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576
    
    输出样例#1: 
    Case #1: 5 
    Case #2: 72
    Case #3: 0
    

    说明

    由于数据包大小限制,故只上传部分数据(第1,2,3,4,5,6,7,8,10,11,12,13,16,19,20点)

    第一组数据解释:

    1(2)=1
    3(2)=11
    5(2)=101
    7(2)=111

    选取5和7进行融合最终得到答案5

    数据范围

    10%的数据n≤5000,t≤1

    另有10%的数据n≤2000,t≤6

    另有20%的数据a≤2^10

    另有5%的数据n≤10^5,a≤2^20,最大的两个数相等

    另有20%的数据n≤10^4,a≤2^15

    另有15%的数据n≤10^5,a≤2^20,t≤6

    另有15%的数据n≤10^5,a≤2^20,t≤12

    100数据n≤10^5,a≤2^20,t≤20

    By:worcher

    一道披着位运算色彩的贪心题目。开始想先手动模拟一下样例,第二个数据模拟了好久。win10自带的计算器是骗子==And运算都是错误,被这里蒙蔽了好久==。所以还是自己写程序输出二进制数比较好==。

    开始只能想到n方算法,但是 交上去只有7分,百思不得其解。觉得应该是找规律的,最长后缀匹配??

    正解:按位贪心。因为序列中的数最大为2^20,所以从20到0倒序枚,找二进制位最高为1的数,然后找次高位为1时从是最高位的数中找出,时间复杂度为O(20n)。也就是每次都更新序列,找到可行的,再从其中计算。

     1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 using namespace std;
     5 typedef long long ll;
     6 
     7 int n,T,ans,cnt;
     8 int seq[200000],neww[200000];
     9 
    10 int main()
    11 {
    12     scanf("%d",&T);
    13     for(int qwq=1;qwq<=T;qwq++)
    14     {
    15         scanf("%d",&n);
    16         for(int i=1;i<=n;i++) scanf("%d",&seq[i]);
    17         for(int k=20;k>=0;k--)
    18         {
    19             cnt=0;
    20             for(int i=1;i<=n;i++)
    21                 if((1<<k)&seq[i]) neww[++cnt]=seq[i];
    22             if(cnt>1)
    23             {
    24                 for(int i=1;i<=cnt;i++) seq[i]=neww[i];
    25                 n=cnt;
    26             }    
    27         }
    28         printf("Case #%d: %d
    ",qwq,seq[1]&seq[2]);
    29     }
    30     return 0;
    31 }
    View Code
  • 相关阅读:
    人脸识别数据库
    美赛
    排序算法
    个人作业——软件工程实践总结作业
    事后诸葛亮(团队)
    个人作业——软件产品案例分析
    Alpha冲刺总结
    Alpha冲刺——Day2
    Alpha冲刺——Day1
    I Know Alpha冲刺随笔集
  • 原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9613862.html
Copyright © 2011-2022 走看看