CF519 ABCD D. A and B and Interesting Substrings(map,好题)

A:http://codeforces.com/problemset/problem/519/A

水题没什么好说的。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
char ma[10][10];
int su,su2;
int main()
{
    while(scanf("%s",ma[0])!=EOF)
    {
        su=0;
        su2=0;
        for(int i=1;i<8;i++)
            scanf("%s",ma[i]);
        for(int i=0;i<8;i++)
        {
            for(int j=0;j<8;j++)
            {
                if(ma[i][j]=='Q')
                {
                    su+=9;
                }
                else if(ma[i][j]=='q')
                {
                    su2+=9;
                }
                else if(ma[i][j]=='R')
                {
                    su+=5;
                }
                else if(ma[i][j]=='r')
                {
                    su2+=5;
                }
                else if(ma[i][j]=='B')
                {
                    su+=3;
                }
                else if(ma[i][j]=='b')
                {
                    su2+=3;
                }
                else if(ma[i][j]=='N')
                {
                    su+=3;
                }
                else if(ma[i][j]=='n')
                {
                    su2+=3;
                }
                else if(ma[i][j]=='P')
                {
                    su+=1;
                }
                else if(ma[i][j]=='p')
                {
                    su2+=1;
                }
                else if(ma[i][j]=='K')
                {
                    su+=0;
                }
                else if(ma[i][j]=='k')
                {
                    su2+=0;
                }
            }
        }
        if(su>su2)
            printf("White
");
        else if(su==su2)
        {
            printf("Draw
");
        }
        else printf("Black
");
    }
    return 0;
}

B:http://codeforces.com/problemset/problem/519/B

水题,简单排序即可。

#include <iostream>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <stack>
#define inf 0x3f3f3f3f
#include <stdio.h>
#include <string.h>
typedef __int64 ll;
#define mod 10000007
using namespace std;
int n,a[100010],b[100010],c[100010],k;
ll sum;
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=0;i<n-1;i++)
        {
            scanf("%d",&b[i]);
        }
        b[n-1]=-1;
        for(int i=0;i<n-2;i++)
        {
            scanf("%d",&c[i]);
        }
        c[n-1]=-2;
        c[n-2]=-3;
        sort(a,a+n);
        sort(b,b+n-1);
        sort(c,c+n-2);
        for(int i=0;i<n;i++)
        {
            if(b[i]!=a[i])
            {
                printf("%d
",a[i]);
                break;
            }
        }
        for(int i=0;i<n-1;i++)
        {
            if(c[i]!=b[i])
            {
                printf("%d
",b[i]);
                break;
            }
        }
    }
    return 0;
}

C:http://codeforces.com/problemset/problem/519/C

给你n个老手,m的新手,有两种组队方式,一种是1个老手带两个新手,另外一种是2个老手带一个新手,求最多的组队对数。

我是暴力求的,记得还有一种方法,不会算了。

#include <iostream>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <stack>
#define inf 0x3f3f3f3f
#include <stdio.h>
#include <string.h>
typedef __int64 ll;
#define mod 10000007
using namespace std;
int n,m;
ll sum;
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        sum=0;
        while(n>0&&m>0)
        {
            if(n>=m&&n>=2)
            {
                sum++;
                n-=2;
                m-=1;
            }
            else if(m>=2)
            {
                sum++;
                n-=1;
                m-=2;
            }
            else break;
        }
        printf("%I64d
",sum);
    }
    return 0;
}

D. A and B and Interesting Substrings

题意:在给的一个串,每个字母有固定的权值求满足如下条件的子串的数目

    1 该子串的首字母和尾字母相同

    2 该串除了首尾字母外,其他字母的权值和为0

思路:维护一个前缀和,用了26个hash分别记录了26种字母每个的前缀和,如果遇到了一个'a',就检查之前有几个和他的前缀和一样的'a',在和上加上去,并维护前缀和。

map真的是好牛逼,可惜比赛的时候没想到,希望以后会用吧!

#include <iostream>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <stack>
#define inf 0x3f3f3f3f
#include <stdio.h>
#include <string.h>
typedef __int64 ll;
#define mod 10000007
using namespace std;
int h[30];
char s[100010];
ll sum,cnt;
int main()
{
    while(scanf("%d",&h[0])!=EOF)
    {
       cnt=0;
       sum=0;
       for(int i=1;i<26;i++)
       {
           scanf("%d",&h[i]);
       }
       scanf("%s",s);
       int l=strlen(s);
       map<ll,ll>q[30];                    //map<ll,int>q[30];
       for(int i=0;i<l;i++)
       {
           cnt+=q[s[i]-'a'][sum];
           sum+=h[s[i]-'a'];
           q[s[i]-'a'][sum]++;
       }
       printf("%I64d
",cnt);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zhangmingcheng/p/4311113.html