zoukankan      html  css  js  c++  java
  • Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)

    A、B都是暴力搞一搞。

    A:

     1 #include<bits/stdc++.h>
     2 #define fi first
     3 #define se second
     4 #define mk make_pair
     5 #define pii pair<int,int>
     6 #define read(x) scanf("%d",&x)
     7 #define sread(x) scanf("%s",x)
     8 #define dread(x) scanf("%lf",&x)
     9 #define lread(x) scanf("%lld",&x)
    10 using namespace std;
    11 
    12 typedef long long ll;
    13 const int inf=0x3f3f3f3f;
    14 const int INF=0x3f3f3f3f3f3f3f3f;
    15 const int N=1e6+7;
    16 const int M=2333;
    17 
    18 ll w[1001];
    19 int a,b;
    20 int main()
    21 {
    22     for(int i=1;i<=1000;i++)
    23         w[i]=w[i-1]+i;
    24     read(a);read(b);
    25     if(a>b)
    26         swap(a,b);
    27     ll ans=INF;
    28     for(int i=a;i<=b;i++)
    29     {
    30         ans=min(ans,w[i-a]+w[b-i]);
    31     }
    32     printf("%lld
    ",ans);
    33     return 0;
    34 }
    35 /*
    36 */
    View Code

    B:

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mk make_pair
    #define pii pair<int,int>
    #define read(x) scanf("%d",&x)
    #define sread(x) scanf("%s",x)
    #define dread(x) scanf("%lf",&x)
    #define lread(x) scanf("%lld",&x)
    using namespace std;
    
    typedef long long ll;
    const int inf=0x3f3f3f3f;
    const int INF=0x3f3f3f3f3f3f3f3f;
    const int N=1e6+7;
    const int M=2333;
    
    ll w[1001];
    int n,a,b;
    vector<int> v[20];
    int main()
    {
        read(n);
        read(a); read(b);
        for(int i=1;i<=n;i++)
            v[0].push_back(i);
        for(int i=0;i<=n;i++)
        {
            if(v[i].size()==2)
                break;
            for(int j=0;j<v[i].size();j+=2)
            {
                if(v[i][j]==a && v[i][j^1]==b || v[i][j]==b && v[i][j^1]==a)
                {
                    printf("%d
    ",i+1);
                    return 0;
                }
                if(v[i][j^1]==a || v[i][j^1]==b)
                    v[i+1].push_back(v[i][j^1]);
                else
                    v[i+1].push_back(v[i][j]);
            }
        }
        puts("Final!");
    }
    /*
    */
    View Code

    C题:刚开始没看到给你的数据差值不小于等于2,感觉不会写,看到了啪啦啪啦写完啦。

     1 #include<bits/stdc++.h>
     2 #define fi first
     3 #define se second
     4 #define mk make_pair
     5 #define pii pair<int,int>
     6 #define read(x) scanf("%d",&x)
     7 #define sread(x) scanf("%s",x)
     8 #define dread(x) scanf("%lf",&x)
     9 #define lread(x) scanf("%lld",&x)
    10 using namespace std;
    11 
    12 typedef long long ll;
    13 const int inf=0x3f3f3f3f;
    14 const int INF=0x3f3f3f3f3f3f3f3f;
    15 const int N=1e6+7;
    16 const int M=2333;
    17 
    18 int n,a[N],mn,cnt[100],ans[100];
    19 int main()
    20 {
    21     int mn=inf;
    22     read(n);
    23     for(int i=1;i<=n;i++)
    24         read(a[i]),mn=min(mn,a[i]);
    25     for(int i=1;i<=n;i++)
    26         a[i]-=mn;
    27     int sum=0;
    28     for(int i=1;i<=n;i++)
    29         cnt[a[i]]++,ans[a[i]]++;
    30     if(!cnt[1] && !cnt[2] || cnt[1] && !cnt[2])
    31     {
    32         printf("%d
    ",n);
    33         for(int i=1;i<=n;i++)
    34             printf("%d ",a[i]+mn);
    35         puts("");
    36     }
    37     else
    38     {
    39         int ret=min(cnt[0],cnt[2]);
    40         int res=(cnt[1]/2)*2;
    41         //printf("%d %d
    ",ret,res);
    42         if(2*ret>=res)
    43         {
    44             printf("%d
    ",n-2*ret);
    45             ans[0]-=ret;
    46             ans[2]-=ret;
    47             ans[1]+=2*ret;
    48 
    49         }
    50         else
    51         {
    52             ans[0]+=res/2;
    53             ans[1]-=res;
    54             ans[2]+=res/2;
    55             printf("%d
    ",n-res);
    56         }
    57         for(int i=0;i<=2;i++)
    58             for(int j=1;j<=ans[i];j++)
    59                 printf("%d ",i+mn);
    60         puts("");
    61     }
    62     return 0;
    63 }
    64 /*
    65 */
    View Code

    D题:是我写过最简单的D题,dfs计算一下每个深度的点有多少个,对于每个深度来说如果是奇数个点贡献是1,偶数个贡献是0。

     1 #include<bits/stdc++.h>
     2 #define fi first
     3 #define se second
     4 #define mk make_pair
     5 #define pii pair<int,int>
     6 #define read(x) scanf("%d",&x)
     7 #define sread(x) scanf("%s",x)
     8 #define dread(x) scanf("%lf",&x)
     9 #define lread(x) scanf("%lld",&x)
    10 using namespace std;
    11 
    12 typedef long long ll;
    13 const int inf=0x3f3f3f3f;
    14 const int INF=0x3f3f3f3f3f3f3f3f;
    15 const int N=1e6+7;
    16 const int M=2333;
    17 
    18 vector<int> edge[N];
    19 int n,d[N];
    20 void dfs(int u,int de)
    21 {
    22     d[de]++;
    23     for(int v:edge[u])
    24         dfs(v,de+1);
    25 }
    26 int main()
    27 {
    28     read(n);
    29     for(int i=2;i<=n;i++)
    30     {
    31         int fa; read(fa);
    32         edge[fa].push_back(i);
    33     }
    34     dfs(1,1);
    35     int ans=0;
    36     for(int i=1;i<=n;i++)
    37         if(d[i]&1)
    38             ans++;
    39     printf("%d
    ",ans);
    40     return 0;
    41 }
    42 /*
    43 */
    View Code

    E题:比赛的时候一直看错题,以为是猜对的概率,题目是唯一确定答案的概率,一直调都不对,结果GG啦,其实也很简单,

    统计一下点与点之间的情况,对于一种字符来说,第二张要翻开的卡的位置都是一样的,算一下这个概率就好啦。

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define mk make_pair
    #define pii pair<int,int>
    #define read(x) scanf("%d",&x)
    #define sread(x) scanf("%s",x)
    #define dread(x) scanf("%lf",&x)
    #define lread(x) scanf("%lld",&x)
    using namespace std;
    
    const int N=5007;
    int n,cnt[26][26][N];
    char s[N];
    double mp[26];
    int main()
    {
        sread(s+1);
        n=strlen(s+1);
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                cnt[s[i]-'a'][s[j]-'a'][j-i]++;
                cnt[s[j]-'a'][s[i]-'a'][n-(j-i)]++;
            }
        }
        for(int i=0;i<26;i++)
        {
            for(int k=1;k<n;k++)
            {
                int tot=0,sum=0;
                for(int j=0;j<26;j++)
                {
                    sum+=cnt[i][j][k];
                    if(cnt[i][j][k]==1)
                        tot++;
                }
                mp[i]=max(mp[i],1.0*tot/sum);
            }
        }
        double ans=0;
        for(int i=1;i<=n;i++)
            ans+=mp[s[i]-'a']/n;
        printf("%.12f
    ",ans);
        return 0;
    }
    /*
    */
    View Code

    F题:题目大意:给你n条线段覆盖的x轴,范围在1-m之间,有一个人开始询问,每次询问一个点的覆盖次数,问你最多几次之后

    还是无法确定是不是有一个点被所有线段覆盖。

    思路:这题想了好久。。。 刚开始以为是和点被覆盖最大值有关,写了很久发现有问题,我们考虑对于两个点a,b来说,如果有一个

    点c在a,b之间,且c < max (a, b) ,那么覆盖a的线段,和覆盖b的线段肯定不完全相同,如果完全相同,肯定有 c>=max(a,b),矛盾。

    所以我们的问题就变成了从里面选出尽可能多的点,使其的覆盖次数满足先增后减,然后就很开心地最长不下降子序列搞一搞就好啦。

     1 #include<bits/stdc++.h>
     2 #define fi first
     3 #define se second
     4 #define mk make_pair
     5 #define pii pair<int,int>
     6 #define read(x) scanf("%d",&x)
     7 #define sread(x) scanf("%s",x)
     8 #define dread(x) scanf("%lf",&x)
     9 #define lread(x) scanf("%lld",&x)
    10 using namespace std;
    11 
    12 const int N=1e5+5;;
    13 int in[N],out[N],cnt[N],d[N],ans1[N],ans2[N];
    14 int n,m;
    15 int main()
    16 {
    17     read(n); read(m);
    18     for(int i=1;i<=n;i++)
    19     {
    20         int l,r;
    21         read(l); read(r);
    22         in[l]++;
    23         out[r]++;
    24     }
    25     int all=0;
    26     for(int i=1;i<=m;i++)
    27     {
    28         all+=in[i];
    29         cnt[i]=all;
    30         all-=out[i];
    31     }
    32     ans1[1]=1;
    33     
    34     d[1]=cnt[1];
    35     int len=1;
    36     for(int i=2;i<=m;i++)
    37     {
    38         if(cnt[i]>=d[len])
    39         {
    40             d[++len]=cnt[i];
    41             ans1[i]=len;
    42         }
    43         else
    44         {
    45             int j=upper_bound(d+1,d+len+1,cnt[i])-d;
    46             ans1[i]=j;
    47             d[j]=cnt[i];
    48         }
    49     }
    50     ans2[m]=1;
    51     d[1]=cnt[m];
    52     len=1;
    53     for(int i=m-1;i>=1;i--)
    54     {
    55         if(cnt[i]>=d[len])
    56         {
    57             d[++len]=cnt[i];
    58             ans2[i]=len;
    59         }
    60         else
    61         {
    62             int j=upper_bound(d+1,d+len+1,cnt[i])-d;
    63             ans2[i]=j;
    64             d[j]=cnt[i];
    65         }
    66     }
    67     int ans=0;
    68     for(int i=1;i<=m;i++)
    69         ans=max(ans,ans1[i]+ans2[i]-1);
    70     printf("%d
    ",ans);
    71     return 0;
    72 }
    73 /*
    74 */
    View Code
  • 相关阅读:
    SSH出现ls command not found
    SVN打包备份
    【转】Linux安装JDK1.7 prm
    任务
    java多线程
    JAVA开发中151个建议
    Linux Too Many OpenFiles
    【收藏】Linux tail命令
    Linux读取属性配置文件注意事项
    [转]Linux端口查看命令
  • 原文地址:https://www.cnblogs.com/CJLHY/p/8510160.html
Copyright © 2011-2022 走看看