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

    再次 回升,rating涨了150+,这次到了1670,发挥不稳定啊。什么时候来次DIV1啊。。。

    感觉这次题,还是挺适合我做的,没有坑爹的题意,基本都挺短的,样例+提示,基本很快就可以得到题意。

    第一题水题。。7分钟1Y。

    第二题题意跑偏了一点点。。20分钟交了次,发现理解错题意了,又折腾了20分钟,2Y。

    第三题推公式,高中数学递推式F(n) + 1是一个等比数列,认真检查+实现,花了我很多时间。

    第四题在剩下半小时,理解了题意,写了个暴力,还写错了,第二组没过。

    今天又看了看,最近老是做,关于树上的题。给一些时间,还是可以做出来的。

    用一个标记数组,标记此点到m个点里 最长的距离。先搞出m个点里的最长路,那么最长路里的点,就是到两端点距离的最大值,然后爆搜一遍。就可以出结果。

    第四题代码:

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 #include <queue>
      5 #include <map>
      6 #include <algorithm>
      7 #include <cstdlib>
      8 using namespace std;
      9 #define M 1000000009
     10 #define LL __int64
     11 #define INF 1000000
     12 struct node
     13 {
     14     int u,v,next;
     15 } edge[200001];
     16 int first[100001];
     17 int p[100001];
     18 int in[100001];
     19 int flag[100001];
     20 int dis[100001];
     21 int pre[100001];
     22 int num[100001];
     23 int t,n;
     24 void CL()
     25 {
     26     t = 0;
     27     memset(first,-1,sizeof(first));
     28 }
     29 void add(int u,int v)
     30 {
     31     edge[t].u = u;
     32     edge[t].v = v;
     33     edge[t].next = first[u];
     34     first[u] = t ++;
     35 }
     36 int bfs(int x)
     37 {
     38     int i,u,v;
     39     for(i = 1; i <= n; i ++)
     40     {
     41         dis[i] = INF;
     42     }
     43     queue<int> que;
     44     que.push(x);
     45     dis[x] = 0;
     46     while(!que.empty())
     47     {
     48         u = que.front();
     49         que.pop();
     50         for(i = first[u]; i != -1; i = edge[i].next)
     51         {
     52             v = edge[i].v;
     53             if(dis[v] > dis[u] + 1)
     54             {
     55                 dis[v] = dis[u] + 1;
     56                 pre[v] = u;
     57                 que.push(v);
     58             }
     59         }
     60     }
     61     int maxz = 0,id;
     62     for(i = 1; i <= n; i ++)
     63     {
     64         if(flag[i])
     65         {
     66             if(maxz < dis[i])
     67             {
     68                 maxz = dis[i];
     69                 id = i;
     70             }
     71         }
     72     }
     73     return id;
     74 }
     75 void dfs(int x)
     76 {
     77     int i,v;
     78     for(i = first[x]; i != -1; i = edge[i].next)
     79     {
     80         v = edge[i].v;
     81         if(!in[v])
     82         {
     83             in[v] = 1;
     84             num[v] = num[x] + 1;
     85             dfs(v);
     86         }
     87     }
     88 }
     89 int main()
     90 {
     91     int u,v,i,m,d,a,b,ans,te,tmax;
     92     scanf("%d%d%d",&n,&m,&d);
     93     CL();
     94     for(i = 1; i <= m; i ++)
     95     {
     96         scanf("%d",&p[i]);
     97         flag[p[i]] = 1;
     98     }
     99     for(i = 1; i < n; i ++)
    100     {
    101         scanf("%d%d",&u,&v);
    102         add(u,v);
    103         add(v,u);
    104     }
    105     if(m > 1)
    106     {
    107         b = bfs(a = bfs(p[1]));
    108         tmax = dis[b];
    109         te = 0;
    110         while(1)
    111         {
    112             num[b] = max(te,tmax - te);
    113             in[b] = 1;
    114             if(a == b) break;
    115             te ++;
    116             b = pre[b];
    117         }
    118     }
    119     else
    120     {
    121         in[p[1]] = 1;
    122     }
    123     for(i = 1; i <= n; i ++)
    124     {
    125         if(in[i])
    126         {
    127             dfs(i);
    128         }
    129     }
    130     ans = 0;
    131     for(i = 1; i <= n; i ++)
    132     {
    133         if(num[i] <= d)
    134             ans ++;
    135     }
    136     printf("%d
    ",ans);
    137     return 0;
    138 }

     第5题,就是爆搜啊。。开始没什么思路,看了一下题解,看别人代码也看不懂,木看懂,英语硬伤啊。。就看到一个懂n!复杂度。。

    算是n!给点提示,排完序后,当前的p[x]可以合并到前面去。然后就是各种注意素数,神马的。。。看着数据可耻的过了。

     1 #include <cstring>
     2 #include <cstdio>
     3 #include <algorithm>
     4 using namespace std;
     5 #define LL __int64
     6 LL p[10],o[10];
     7 int flag[10];
     8 bool cmp(LL a,LL b)
     9 {
    10     return a > b;
    11 }
    12 int ans,n;
    13 void dfs(int x,int sum)
    14 {
    15     LL i,temp,num;
    16     if(sum > ans) return ;
    17     if(x > n)
    18     {
    19         num = 0;
    20         for(i = 1;i <= n;i ++)
    21         {
    22             if(p[i] == o[i])
    23             num ++;
    24         }
    25         if(num > 1) sum ++;
    26         ans = min(ans,sum);
    27         return ;
    28     }
    29     for(i = 1;i < x;i ++)
    30     {
    31         if(p[i]%p[x] == 0)
    32         {
    33             p[i] = p[i]/p[x];
    34             if(flag[x])
    35             dfs(x+1,sum+1);
    36             else
    37             dfs(x+1,sum);
    38             p[i] = p[i]*p[x];
    39         }
    40     }
    41     temp = p[x];
    42     num = 0;
    43     for(i = 2;i*i <= temp;i ++)
    44     {
    45         while(temp%i == 0)
    46         {
    47             temp = temp/i;
    48             num ++;
    49         }
    50     }
    51     if(temp != 1) num ++;
    52     if(temp != p[x]) num ++;
    53     dfs(x+1,sum+num);
    54 }
    55 int main()
    56 {
    57     LL i,j,num,temp;
    58     scanf("%d",&n);
    59     for(i = 1;i <= n;i ++)
    60     scanf("%I64d",&p[i]);
    61     sort(p+1,p+n+1,cmp);
    62     for(i = 1;i <= n;i ++)
    63     o[i] = p[i];
    64     num = 0;
    65     temp = p[1];
    66     ans = 1000000;
    67     for(i = 2;i*i <= temp;i ++)
    68     {
    69         while(temp%i == 0)
    70         {
    71             temp = temp/i;
    72             num ++;
    73         }
    74     }
    75     if(temp != 1) num ++;
    76     if(temp != p[1]) num ++;
    77     for(i = 1;i <= n;i ++)
    78     {
    79         for(j = 2;j*j <= p[i];j ++)
    80         {
    81             if(p[i]%j == 0)
    82             {
    83                 flag[i] = 1;
    84                 break;
    85             }
    86         }
    87     }
    88     dfs(2,num);
    89     printf("%d
    ",ans);
    90     return 0;
    91 }
  • 相关阅读:
    Java8 Time
    Java8 Stream
    Java8 Lambda
    Thinking in java 阅读
    String 中的 split 进行字符串分割
    Kubernetes 学习(九)Kubernetes 源码阅读之正式篇------核心组件之 Scheduler
    Kubernetes 学习(八)Kubernetes 源码阅读之初级篇------源码及依赖下载
    Golang(八)go modules 学习
    SQLAIchemy(二)ORM 相关
    SQLAIchemy 学习(一)Session 相关
  • 原文地址:https://www.cnblogs.com/naix-x/p/3264474.html
Copyright © 2011-2022 走看看