zoukankan      html  css  js  c++  java
  • 2019西安多校联训 Day2

    试题链接:http://www.accoders.com/contest.php?cid=1894   考试密码请私信;

       T1

      残忍WA 0,明明就是一道非常菜的字符串QAQ

      思路:一共找四种东西,AC,CA,ACA,CAC,显然后两者

    都可以作为AC或CA使用,每次查找后将查找到的串全变为

    'B'避免重复搜索,三个bool变量记录即可

    T1-
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 char s[100010];
     4 int len;
     5 bool ac,ca,ak;
     6 int main(){
     7     while(scanf("%s",&s)==1){
     8         len=strlen(s);
     9         for(register int i=0;i<len-1;i++){
    10             if((s[i]=='A'&&s[i+1]=='C'&&s[i+2]=='A'&&ak==0)||(s[i]=='C'&&s[i+1]=='A'&&s[i+2]=='C'&&ak==0)){ak=1;s[i]=s[i+1]=s[i+2]='B';}
    11             if(s[i]=='A'&&s[i+1]=='C'&&ac==0){
    12                 ac=1;
    13                 s[i]='B';s[i+1]='B';
    14             }
    15             if(s[i]=='C'&&s[i+1]=='A'&&ca==0){
    16                 ca=1;
    17                 s[i]='B';s[i+1]='B';
    18             }
    19         }
    20         if(ak==1&&(ac==1||ca==1)) printf("YES
    ");
    21         else if(ac==1&&ca==1) printf("YES
    ");
    22         else printf("NO
    ");
    23         ac=0,ca=0,ak=0;
    24         memset(s,' ',sizeof(s));
    25     }
    26     return 0;
    27 }
    AC

       T2

      一道看上去像大水题的难题,需要神奇的搜索方式来搞

    掉,难度中上

      思路:首先找到大兵所在位置,然后填补他所在2*2的格子,

    然后是4*4,8*8以对角线的方式来搜索填补对面的格子,以确保

    一定填满的同时,填法不会出锅,填的同时记录填补格子的坐标

    和放置方式,最后按照字典序输出即可

    T2-
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,k,a[1201][1201];
     4 int f[11]={0,2,4,8,16,32,64,128,256,512,1024};
     5 struct node{
     6     int x,y,w;
     7 }ans[1400010];
     8 int ansnum;
     9 bool cmp(node p,node q){
    10     if(p.x==q.x) return p.y<q.y;
    11     else return p.x<q.x;
    12 }
    13 void dfs(int x1,int y1,int x2,int y2,int X,int Y){
    14     if(x2-x1==1&&y2-y1==1){
    15         if(X==x1&&Y==y1){ans[++ansnum].x=x1,ans[ansnum].y=y1,ans[ansnum].w=3;}
    16         if(X==x1&&Y==y2){ans[++ansnum].x=x1,ans[ansnum].y=y1,ans[ansnum].w=1;}
    17         if(X==x2&&Y==y1){ans[++ansnum].x=x1,ans[ansnum].y=y1,ans[ansnum].w=2;}
    18         if(X==x2&&Y==y2){ans[++ansnum].x=x1,ans[ansnum].y=y1,ans[ansnum].w=4;}
    19         return;
    20     }
    21     int x=(x2-x1+1)/2+x1-1;
    22     int y=(y2-y1+1)/2+y1-1;
    23     if(X<=x&&Y<=y){
    24         dfs(x1,y1,x,y,X,Y);
    25         ans[++ansnum].x=x,ans[ansnum].y=y,ans[ansnum].w=3;
    26         dfs(x+1,y1,x2,y,x+1,y);
    27         dfs(x+1,y+1,x2,y2,x+1,y+1);
    28         dfs(x1,y+1,x,y2,x,y+1);
    29     }
    30     if(X<=x&&Y>y){
    31         dfs(x1,y+1,x,y2,X,Y);
    32         ans[++ansnum].x=x,ans[ansnum].y=y,ans[ansnum].w=1;
    33         dfs(x1,y1,x,y,x,y);
    34         dfs(x+1,y1,x2,y,x+1,y);
    35         dfs(x+1,y+1,x2,y2,x+1,y+1);
    36     }
    37     if(X>x&&Y<=y){
    38         dfs(x+1,y1,x2,y,X,Y);
    39         ans[++ansnum].x=x,ans[ansnum].y=y,ans[ansnum].w=2;
    40         dfs(x+1,y+1,x2,y2,x+1,y+1);
    41         dfs(x1,y1,x,y,x,y);
    42         dfs(x1,y+1,x,y2,x,y+1);
    43     }
    44     if(X>x&&Y>y){
    45         dfs(x+1,y+1,x2,y2,X,Y);
    46         ans[++ansnum].x=x,ans[ansnum].y=y,ans[ansnum].w=4;
    47         dfs(x1,y1,x,y,x,y);
    48         dfs(x1,y+1,x,y2,x,y+1);
    49         dfs(x+1,y1,x2,y,x+1,y);
    50     }
    51 }
    52 int main(){
    53     int x,y;
    54     scanf("%d%d%d",&k,&x,&y);
    55     n=f[k];
    56     dfs(1,1,n,n,x,y);
    57     sort(ans+1,ans+ansnum+1,cmp);
    58     for(register int i=1;i<=ansnum;i++) printf("%d %d %d
    ",ans[i].x,ans[i].y,ans[i].w);
    59     return 0;
    60 }
    拯救瑞恩

       T3

      个人认为一道极其毒瘤的题(尤其针对我这种链表+dfs打不好的人)

      思路:用链式前向星存储图,然后dfs搜索答案,在dfs中用二分查找

    来维护区间的值....(这谁顶得住)

    T3-
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 struct node{
     4     long long nxt,to,dis; 
     5 }edge[2000010];
     6 long long head[2000010];
     7 long long cnt,ans,n,k,m,u,v,w;
     8 long long a[2000010],zkcrp[2000010];
     9 void addedge(int from,int to,int w)
    10 {
    11     cnt++;
    12     edge[cnt].to=to;
    13     edge[cnt].dis=w;
    14     edge[cnt].nxt=head[from];
    15     head[from]=cnt;
    16 }
    17 bool ef(int l,int r,long long zkc)
    18 {
    19     if(zkcrp[l]==zkc||zkcrp[r]==zkc) return true;
    20     if(r-l<=1) return false;
    21     int mid=(l+r)>>1;
    22     if(zkcrp[mid]<zkc)return ef(mid+1,r,zkc);
    23     else return ef(l,mid,zkc);
    24 }
    25 void dfs(long long now,long long deep)
    26 {
    27     if(ef(0,deep,a[now]-k)) ans++;
    28     for(register int i=head[now];i;i=edge[i].nxt)
    29     {
    30         if(a[edge[i].to]||edge[i].to==m)continue;
    31         a[edge[i].to]=a[now]+edge[i].dis;
    32         zkcrp[deep+1]=a[edge[i].to];
    33         dfs(edge[i].to,deep+1);
    34     }
    35 }
    36 int main(){
    37     scanf("%lld%lld%lld",&n,&m,&k);
    38     for(register int i=1;i<n;i++){
    39         scanf("%lld%lld%lld",&u,&v,&w);
    40         addedge(u,v,w);
    41         addedge(v,u,w);
    42     }
    43     dfs(m,0);
    44     printf("%lld
    ",ans);
    45     return 0;
    46 }
    tree

       end;

     

  • 相关阅读:
    c++ 对象大小内存占用分析
    运维(SA)修仙 之路 II
    分享好文章-Ansible 进阶技巧
    java JWT 登录认证
    ftp:500 OOPS: chroot
    centos 磁盘清理
    redis分析命令
    linux查找内容
    vim使用
    查看进程端口
  • 原文地址:https://www.cnblogs.com/liuhailin/p/11009616.html
Copyright © 2011-2022 走看看