zoukankan      html  css  js  c++  java
  • Codeforces Round #306 (Div. 2)

    玩的有点脱得一场。。

    A:hack最多,本来被kack 能写出来的,但是D快写出来了,所以没管,没想到后面居然变为1000pts,做题顺序,和比赛经验缺乏。

    当时只想到一遍扫找到先“AB",即s[pos]='A',s[pos+1]='B',然后再【0,pos-1]找”BA";在【pos+2,s.size())(开区间)找"BA";

    但是这是不够的,比如"ABAB" 可以hack掉,

    所以还有再扫一遍过程一样:找到先“BA",即s[pos]='B',s[pos+1]='A',然后再【0,pos-1]找”AB";在【pos+2,s.size())(开区间)找"AB";

    代码乱写,大概就是这个思路:

       

     1 #include<iostream>
     2 #include<string.h>
     3 #include<string>
     4 #include<math.h>
     5 #include<stdio.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<vector>
     9 #include<set>
    10 #include<map>
    11 
    12 using namespace std;
    13 #define N 1000010
    14 #define inf 0x3f3f3f
    15 int a[N];
    16 string s;
    17 int b[N];
    18 int main()
    19 {
    20     cin>>s;
    21     int ans=0,ans1=0;
    22     int n=s.size();
    23     int pos=0;
    24     for (int i=0;i<n-1;i++)
    25     {
    26         if (s[i]=='A'&&s[i+1]=='B')
    27         {
    28             ans++;
    29             pos=i;
    30             break;
    31         }
    32     }
    33 
    34      for (int i=0;i<pos-1;i++)
    35      if (s[i]=='B'&&s[i+1]=='A')
    36      {
    37             ans1++;
    38 
    39             break;
    40         }
    41      for (int i=pos+2;i<n;i++)
    42      if (s[i]=='B'&&s[i+1]=='A')
    43         {
    44             ans1++;
    45 
    46             break;
    47         }
    48 
    49     if (ans&&ans1) {cout<<"YES";return 0;}
    50 
    51 
    52     ans=ans1=0;
    53     pos=0;
    54 
    55     for (int i=0;i<n-1;i++)
    56     {
    57         if (s[i]=='B'&&s[i+1]=='A')
    58         {
    59             ans++;
    60             pos=i;
    61             break;
    62         }
    63     }
    64 
    65      for (int i=0;i<pos-1;i++)
    66      if (s[i]=='A'&&s[i+1]=='B')
    67         {
    68             ans1++;
    69             break;
    70         }
    71 
    72      for (int i=pos+2;i<n;i++)
    73      if (s[i]=='A'&&s[i+1]=='B')
    74     {
    75             ans1++;
    76             break;
    77         }
    78 
    79     if (ans&&ans1) {cout<<"YES";return 0;
    80     }
    81 
    82 
    83     cout<<"NO";
    84       return 0;
    85 }
    View Code

    B题:DFS初级题,但是我写了这道题将近40分钟,太弱了

    DFS(t,sum,Max,Min):处理到第t位,当前和,Max,Min;

    选与不选,之前又看错题,以为求连续(ps 那样更简单)

     1 #include<iostream>
     2 #include<string.h>
     3 #include<string>
     4 #include<math.h>
     5 #include<stdio.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<vector>
     9 #include<set>
    10 #include<map>
    11 
    12 using namespace std;
    13 #define N 1000010
    14 #define inf 0x3f3f3f
    15 
    16 typedef long long ll;
    17 
    18 int a[N];
    19 int n,l,r,x;
    20 
    21 
    22 int dfs(int t,int sum ,int Max,int Min)
    23 {
    24 
    25     if (t>n&&sum>=l&&sum<=r&&Max-Min>=x) return 1;
    26 
    27     if (t>n) return 0;
    28     int ret=0;
    29     ret+=dfs(t+1,sum,Max,Min);
    30     Max=max(Max,a[t]);
    31     Min=min(Min,a[t]);
    32     sum+=a[t];
    33     ret+=dfs(t+1,sum,Max,Min);
    34     return ret;
    35 }
    36 
    37 int main()
    38 {
    39 
    40       cin>>n>>l>>r>>x;
    41       for (int i=1;i<=n;i++)
    42       {
    43           cin>>a[i];
    44       }
    45       cout<<dfs(1,0,-1,inf);
    46       return 0;
    47 }
    View Code

    C:脑洞大,退了太久了,主要还是自己没一眼看出来;

    我们在字符串中找一位是8的倍数,

    在两位中找是8的倍数,

    在三位中找是8的位数;

     1 #include<iostream>
     2 #include<string.h>
     3 #include<string>
     4 #include<math.h>
     5 #include<stdio.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<vector>
     9 #include<set>
    10 #include<map>
    11 
    12 using namespace std;
    13 #define N 1000010
    14 #define inf 0x3f3f3f
    15 
    16 typedef long long ll;
    17 
    18 int a[N];
    19 int n,l,r,x;
    20 
    21 int main()
    22 {
    23   string s;
    24   cin>>s;
    25   int len=s.size();
    26   for (int i=0;i<len;i++)
    27   if ((s[i]-'0')%8==0)
    28   {
    29       cout<<"YES"<<endl;
    30       cout<<s[i];
    31       return 0;
    32   }
    33 
    34   for (int i=0;i<len;i++)
    35   for (int j=i+1;j<len;j++)
    36   {
    37       int tmp=(s[i]-'0')*10+s[j]-'0';
    38       if (tmp%8==0)
    39       {
    40           cout<<"YES"<<endl;
    41           cout<<tmp;
    42           return 0;
    43       }
    44   }
    45    for (int i=0;i<len;i++)
    46    for (int j=i+1;j<len;j++)
    47    for (int p=j+1;p<len;p++)
    48   {
    49       int tmp=(s[i]-'0')*100+(s[j]-'0')*10+s[p]-'0';;
    50       if (tmp%8==0)
    51       {
    52           cout<<"YES"<<endl;
    53           cout<<tmp;
    54           return 0;
    55       }
    56   }
    57 
    58   cout<<"NO";
    59   return 0;
    60 }
    View Code

    D:构造题,只留下30分钟构造,还剩8分钟写出来,发现看错了题目(日了)没有重边,--!

        首先:证明k=偶数不成立。

        1.因为有桥,所以桥连的两边的度为1

        2.那么将图分为两部分,桥的两点分别在一部分

        3.那么就是一部分图,一个点的度为k-1,其他点度为k,

         4.当k为偶数时,k-1为奇数,那么这部分总的度为奇数,但是一个图的度数和一定是偶数(因为一条边连两个点);

        证毕.

        关于构造:

        这里先只考虑一部分,另一部分是相似的操作;

        先桥的一点1,  1先连k-1个点,那么1的度数满足,

        然后这k-1个点,分别再连k-1个点

      {

       2->k+1,

       3->k+1,

       4->k+1,

      .... 

      k->k+1,

     ....

     2->k+2,

      ....

      类推

    }

    所以就剩下k-1(即是下标:k+1->2*k-1) 个点的度都差一,

    但是k-1是偶数,只要没两个连一下就好了,

    另一部分相同,最后是连桥。(1,2*k);

    点数是:4*k-2;

    代码:

     1 #include<iostream>
     2 #include<string.h>
     3 #include<string>
     4 #include<math.h>
     5 #include<stdio.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<vector>
     9 #include<set>
    10 #include<map>
    11 
    12 using namespace std;
    13 #define N 1000010
    14 #define inf 0x3f3f3f
    15 
    16 typedef long long ll;
    17 int n,m;
    18 
    19 int a[123456],b[123456];
    20 
    21 int main()
    22 {
    23   int k;
    24   cin>>k;
    25   if (k%2==0)
    26   {
    27       cout<<"NO";
    28       return 0;
    29   }
    30 
    31 
    32   for (int i=2;i<=k;i++)
    33   a[++m]=1,b[m]=i;
    34 
    35   for (int i=k+1;i<2*k;i++)
    36   for (int j=2;j<=k;j++)
    37   a[++m]=j,b[m]=i;
    38 
    39   for (int i=k+1;i<2*k-1;i+=2)
    40   a[++m]=i,b[m]=i+1;
    41 
    42 
    43  // a[++m]=2*k-1;b[m]=k+1;
    44 
    45   int mm=m;
    46 
    47   for (int i=1;i<=mm;i++)
    48   a[++m]=a[i]+2*k-1,b[m]=b[i]+2*k-1;
    49 
    50   a[++m]=1;
    51   b[m]=2*k;
    52 
    53   cout<<"YES"<<endl;
    54   cout<<4*k-2<<" "<<m<<endl;
    55 
    56   for (int i=1;i<=m;i++)
    57   printf("%d %d
    ",a[i],b[i]);
    58   return 0;
    59 }
    View Code
  • 相关阅读:
    docker删除所有服务service,停止并删除所有容器container
    harbor
    yml文件
    linux 上安装portainer.io
    凤凰之谜 1/4 潜行者
    凤凰之谜 4/4 猎人
    凤凰之谜 3/4 德鲁伊 迷宫
    Dijkstra最短路径算法
    LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式
    How do I run a Python script from C#?
  • 原文地址:https://www.cnblogs.com/forgot93/p/4554183.html
Copyright © 2011-2022 走看看