ACM-ICPC 2014北京邀请赛 H Happy Reverse [模拟]

题意:给出n个二进制串,可以把其中的一些0和1反转(即0变1,1变0),找出转化后n个串中的最大值和最小值的差值。

分析:思路就是把所有的串和反转的存在一个数组中,然后排序,找最大值和最小值的差,(如果是同一个串反转的就找第二大的和最小的或第二小和最大的中的最大值)。注意假如只有一个串的话结果为0

DEBUG:

这题写了好久

1.第一次用vim,很爽,但是还没熟练

2.忽视了这题的范围,显然要用longlong

3.用了longlong后还WA,用脚本跑出来数据发现在longlong下,min的值要变成(1<<63)-1但是不能这么写,应该写个longlong 是1<<30,然后在这个longlong基础上再移位

最后不得不说句 BNUOJ真的比POJ好看很多哈

    #include <iostream>
    #include <cmath>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    char str[111111][222];
    long long tmp=1<<30;
    const long long MAX_LONG=(tmp<<33)-1;
    long long num[111111];
    long long m,n;
    void getRev(char* to,char* source,long long len)
    {
        for(long long i=0;i<len;i++)
            to[i]=source[i]=='0'?'1':'0';
        to[len]='\0';
    }
    long long getNum(char* s,long long len)
    {
        long long sum=0;
        for(long long i=0;i<len;i++)
        {
            sum*=2;
            sum+=s[i]-'0';
        }
        return sum;
    }
    int main()
    {
        long long test;
        cin>>test;
        for(long long time=1;time<=test;time++)
        {
            cin>>m>>n;
            for(long long i=1;i<=m;i++)
                cin>>str[i];
            /*if(m==1)
            {
                printf("Case #%d: 0\n",time);
                continue;
            }*/
            for(long long i=m+1;i<=2*m;i++)
                getRev(str[i],str[i-m],n);
            long long minn=MAX_LONG;long long maxn=0;
            for(long long i=1;i<=2*m;i++)
                num[i]=getNum(str[i],n);
            long long max1=0,max1index,min1=MAX_LONG,min1index;
            long long max2=0,max2index,min2=MAX_LONG,min2index;
            for(long long i=1;i<=2*m;i++)
            {
                if(num[i]>max1)
                {
                    max1=num[i];
                    max1index=i;
                }
                if(num[i]<min1)
                {
                    min1=num[i];
                    min1index=i;
                }
            }
            for(long long i=1;i<=2*m;i++)
            {
                if(i!=max1index&&num[i]>max2)
                {
                    max2=num[i];
                    max2index=i;
                }
                if(i!=min1index&&num[i]<min2)
                {
                    min2=num[i];
                    min2index=i;
                }
            }
            if(abs(min1index-max1index)!=m)
            {
                maxn=max1;
                minn=min1;
            }
            else
            {
                if(max1-min2>max2-min1)
                {
                    //cout<<"1"<<endl;
                    maxn=max1;minn=min2;
                }
                else
                {
                    //cout<<"2"<<endl;
                    maxn=max2;minn=min1;
                }
            }
            //cout<<maxn<<' '<<minn<<endl;
            printf("Case #%lld: %lld\n",time,maxn-minn);
        }
        return 0;
    }

ACM-ICPC 2014北京邀请赛 H Happy Reverse [模拟],布布扣,bubuko.com

时间: 2024-10-13 16:04:38

ACM-ICPC 2014北京邀请赛 H Happy Reverse [模拟]的相关文章

2014北京邀请赛 Happy Reversal

H. Happy Reversal 64-bit integer IO format: %lld      Java class name: Main Elfness is studying in an operation "NOT". For a binary number A, if we do operation "NOT A", after that, all digits of A will be reversed. (e.g. A=1001101, af

2014 北京邀请赛ABDHJ题解

A. A Matrix 点击打开链接 构造,结论是从第一行开始往下产生一条曲线,使得这条区间最长且从上到下递减, #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <stdio.h> #include <vector> #include <set> using namespace std; #defi

2014北京邀请赛(部分题解)

马上要去比赛了. 今天做了一下2014北京邀请赛,出了两道题目,感觉很水啊... 首先H题: H. Happy Reversal Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main Submit Status PID: 34988 Font Size:  +   - Elfness is studying

BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂

题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 题目大意:问n长度的串用0~k的数字去填,有多少个串保证任意子串中不包含0~k的某一个全排列 邀请赛上A的较多的一道题,比赛的时候死活想不出,回来之后突然就想通了,简直..... = =! 解题思路: 对于所有串我们都只考虑末尾最多有多少位能构成全排列的一部分(用l来表示),即最多有多少位不重复的数字出现,将问题转化为求末尾最多有k位能构成全排列的串的总数量 假设k为5,有一个

2014北京邀请赛E题-矩阵快速幂

题意:长度为n(1<=n<=10^18)的并且任意连续子串都不是0-k(1<=k<=9)的一个排列的字符串有多少种. 解法:矩阵快速幂.dp[i][j]表示i长度最后连续j个不同(即最后j个无重复,最后j+1个有重复)的字符串的个数.状态选好很重要.设计状态时最重要考虑是唯一性和可传递性,比赛时明明知道肯定是矩阵快速幂,但是一直没想到这个状态表示,自己设计的自己都不会转移. dp[i][j]有了后,后边加一个字符,这个字符可以是j之内的任意一个,也可以是j以外的,这样枚举每种情况,

BNUOJ 34985 Elegant String 2014北京邀请赛E题 动态规划 矩阵快速幂

Elegant String Time Limit: 1000msMemory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,-, k

北京邀请赛 H. Happy Reversal

3.Setting Up and Configuring Backup and Recovery 这个单元讲述如何启动.与rman client如何互动,准备rman环境,实现备份和恢复策略 注意:尽管闪回数据库和安全还原点不是真的数据库备份,但是它们是数据保护策略一个重要部分.这些特性需要一些初始化设置,这些设置依赖于在备份策略中你怎么混合它们.Chapter 5-Data Protection with Restore Points andFlashback Database 提供了关于怎么

hihocoder 1084 扩展KMP &amp;&amp; 2014 北京邀请赛 Justice String

hihocoder 1084 : http://hihocoder.com/problemset/problem/1084 北京邀请赛 Just  String http://www.bnuoj.com/v3/problem_show.php?pid=34990 两道题同样的做法,题目基本内容是找到A的字串中和B串长度一样,且不同的字符个数不超过k个的置. 以hihocoder 1084为例, 是求有多少个A的字串的,与B串长度一样,且不同的字符个数不超过k. 分析:预处理hash,然后对每个字

2014北京邀请赛反思

北京嘛,我大天朝之帝都,当然是高手云集撒. 躺了21个小时的火车,历史以来最久了.旅社住"7天",一直以为"7天"是为情侣们准备的,事实估摸着也是这样.我哩个擦,厕所门不能锁,小小脑补了一下,顿时邪恶万分... 张逗彪找gf去了,被梁平君吼了,搞得我拒绝了同学周六早上带我逛北京的邀请.算了躺床睡觉. 开幕式,看到了会讲笑话的董适,果然是会讲段子!知道了他们信科院就有3个院士,呵呵,湖大总共几个院士? 热身赛,真忧伤!题目改了,没看到,一直在想tm别人能在1-50(实