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
  • 相关阅读:
    Maximum Flow Exhaustion of Paths Algorithm
    ubuntu下安装java环境
    visualbox使用(二)
    vxworks一个超级奇怪的错误(parse error before `char')
    February 4th, 2018 Week 6th Sunday
    February 3rd, 2018 Week 5th Saturday
    February 2nd, 2018 Week 5th Friday
    February 1st, 2018 Week 5th Thursday
    January 31st, 2018 Week 05th Wednesday
    January 30th, 2018 Week 05th Tuesday
  • 原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9613862.html
Copyright © 2011-2022 走看看