zoukankan      html  css  js  c++  java
  • 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)

    这次是Div.1+Div.2,所以有7题。

    因为时间较早,而且正好赶上训练,所以机房开黑做。

    然而我们都只做了3题。:(。

    链接

    【A】声控解锁

    题意:

    Arkady的宠物狗Mu-mu有一只手机。它需要朝这个手机吠一个英文单词密码(两个字符长),手机才能解锁。

    Mu-mu的仇敌,Kashtanka想要解锁Mu-mu的手机,但是它只会说一些两个字符长的英文单词。

    它想要用某种顺序吠出若干个英文单词,使得手机能解锁。告诉Kashtanka它有没有可能做到这一点。

    输入:

    第一行一个两个字符长的字符串,表示密码。

    第二行一个正整数(n;(1leqslant nleqslant100)),表示Kashtanka会说的单词数量。

    接下来(n)行,每行一个两个字符长的字符串,表示Kashtanka会的单词。

    输出:

    YES或NO表示是否能做到。

    题解:

     1 #include<cstdio>
     2 #include<set>
     3 #include<algorithm>
     4 #include<queue>
     5 #include<map>
     6 #define F(i,n) for(int i=1;i<=n;++i)
     7 #define R(i,a,b) for(int i=a;i<=b;++i)
     8 #define dF(i,n) for(int i=n;i>=1;--i)
     9 #define IINF 999999999
    10 using namespace std;
    11 int n,Ans=0;
    12 char a[3];
    13 char st[1001][3];
    14 int h[606],l[606];
    15 int main(){
    16     scanf("%s",a);
    17     scanf("%d",&n);
    18     F(i,n){
    19         scanf("%s",st[i]);
    20         if(st[i][0]==a[0]&&st[i][1]==a[1]) Ans=1;
    21         h[st[i][0]]=1;
    22         l[st[i][1]]=1;
    23     }
    24     if(h[a[1]]&&l[a[0]]) Ans=1;
    25     if(Ans==1) puts("YES");
    26     else puts("NO");
    27     return 0;
    28 }

    【B】和时间赛跑

    题意:

    你曾经有这样的经历吗?要出一套题,离比赛开始只有8小时了,可是你却一道题都没出。

    Mr.江有过。但是他真的有一个很不可拒绝的借口:他面对着一个时空悖论,时间和空间互换了位置!

    整个宇宙变成了一个巨大的钟表。时针、分针和秒针静静地躺在钟面上。时间静止了,钟表显示的时间是(h)时(m)分(s)秒。

    Mr.江上次和教练谈话是(t_{1})时,而比赛在(t_{2})时开始。这意味着Mr.江需要从(t_{1})指针移动到( _{2})指针。

    但Mr.江在空间上的移动,就意味着Mr.江在现实中的时间上的衰老。但是众所周知,Mr.江有无限的时间支配,所以我们不需要担心这个。

    如果Mr.江的道路上有指针挡着,他就不能通过。当然,Mr.江可以顺时针或逆时针行走。

    保证任意一个指针不在整时刻度上。

    判断Mr.江能否成功准时举办比赛?(或者我们应该说“准空”?)

    输入:

    五个数(h,m,s,t_{1},t_{2};(1leqslant hleqslant12,0leqslant m,sleqslant59,1leqslant t_{1},t_{2}leqslant12,t_{1} eq t_{2}))。

    输出:

    YES或NO表示能否从(t_{1})到达(t_{2})。

    题解:

    判断三个指针在不在(t_{1},t_{2})的同一侧。

     1 #include<cstdio>
     2 #include<set>
     3 #include<algorithm>
     4 #include<queue>
     5 #include<map>
     6 #define F(i,n) for(int i=1;i<=n;++i)
     7 #define R(i,a,b) for(int i=a;i<=b;++i)
     8 #define dF(i,n) for(int i=n;i>=1;--i)
     9 #define IINF 999999999
    10 using namespace std;
    11 int h,m,s,t1,t2;
    12 int h1,h2,h3;
    13 int w1,w2,w3;
    14 int main(){
    15     scanf("%d%d%d%d%d",&h,&m,&s,&t1,&t2);
    16     if(h==12) h=0;
    17     if(t1==12) t1=0;
    18     if(t2==12) t2=0;
    19     h1=h*3600+m*60+s;
    20     h2=m*720+s*12;
    21     h3=s*720;
    22     t1*=3600, t2*=3600;
    23 //    printf("%d %d %d %d %d
    ",h1,h2,h3,t1,t2);
    24     if(t1>t2) swap(t1,t2);
    25     if(t1<=h1&&h1<=t2) w1=1;
    26     if(t1<=h2&&h2<=t2) w2=1;
    27     if(t1<=h3&&h3<=t2) w3=1;
    28     if(w1==w2&&w2==w3) puts("YES");
    29     else puts("NO");
    30     return 0;
    31 }

    【C】资格预审赛

    题意:

    Snark和Phillip在为了将来的八强赛的资格预审赛做准备,他们的题库中有(n)道题,他们想从中选出一个非空子集,作为题目。

    有(k)个队伍会参加比赛。有一些队伍已经知道了题库中的某些题。

    为了让比赛对他们来说更有趣,每个队伍知道的题目最多占总题目中的一半。

    判断Snark和Phillip能否出一套有趣的比赛。

    输入:

    第一行两个正整数(n,k;(1leqslant nleqslant10^{5},1leqslant kleqslant4)),题库中题目总数和参加比赛的队伍数量。

    接下来(n)行,每行(k)个整数,等于0或1。第(i)行的第(j)个数是1就表示第(j)队知道第(i)题,是0反之。

    输出:

    YES或NO表示能否出一套有趣的比赛。

    题解:

    可以证明,在队伍数量最多为4的情况下,最多选2道题就可以了。

    举个例子,当选出4题时,可以成为有趣的比赛,那么选出其中两题,必定也可以成为有趣的比赛。

    根据定义,最终题目所组成的矩阵每列最多只有两个1,而某列有两个1在某两题的位置上,就意味着这两题不能同时选出。

    而只有4列,最多只有4对题不能同时选出,但是题目的组合有6对,所以至少能选出两种不同的题目组合满足要求。

    当题目数量大于4或者等于3时,也是类似证法。

    而选两题的时间是(O(n^{2}))的,不是很优秀,但是注意到,只有2^4=16种不同的题目,所以复杂度应该是16^2=256的。

    #include<cstdio>
    #include<set>
    #include<algorithm>
    #include<queue>
    #include<map>
    #define F(i,n) for(int i=1;i<=n;++i)5
    #define R(i,a,b) for(int i=a;i<=b;++i)
    #define dF(i,n) for(int i=n;i>=1;--i)
    #define IINF 999999999
    using namespace std;
    int n,m;
    int x[5];
    int a[17];
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i){
            for(int j=1;j<=m;++j) scanf("%d",&x[j]);
            a[x[1]+x[2]*2+x[3]*4+x[4]*8]=1;
        }
        if(a[0]) {puts("YES"); return 0;}
        else{
            for(int i=0;i<16;++i)
                for(int j=0;j<16;++j){
                    if((i&j)==0&&a[i]&&a[j]){
                        puts("YES");
                        return 0;
                    }
                }
        }
        puts("NO");
        return 0;
    }

    【D】巨大的字符串

    题意:

    有n(1<=n<=100)个01字符串,每个长度小于等于100。

    共有m(1<=m<=100)个操作,操作为"x y",表示把第y个字符串接在第x个字符串后面,得到编号为总编号+1的新字符串,并询问这个字符串中最大的满足条件的k,使得所有k位的01字符串(共有2^k个)都是这个字符串的子串。

    输入:

    第一行,n。

    接下来n行,每行一个01字符串,表示第i个字符串。

    接下来一行,m。

    接下来m行,每行2个正整数,xi和yi,表示第i个操作。

    输出:

    对于每个询问,输出对应的k。

    题解:

    可以证明,k大约是<=17的。

  • 相关阅读:
    k8s采坑记
    [dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。
    亲测可用,iptables实现NAT转发。
    【转】干货,Kubernetes中的Source Ip机制。
    k8s实践
    干货!分享一款windows下的磁盘分析神器。
    干货,不小心执行了rm -f,除了跑路,如何恢复?
    Java8函数式编程
    搭建git服务器
    Python3安装
  • 原文地址:https://www.cnblogs.com/PinkRabbit/p/7648108.html
Copyright © 2011-2022 走看看