Codeforces Round #436 (Div. 2)

来源:互联网 发布:王者荣耀数据封神榜67 编辑:程序博客网 时间:2024/06/01 08:10

感冒复出后的第一场,水题场,之前还在为自己未能参加水题南宁网络赛而遗憾,现在立刻来了一场水体版cf

然而,没想到却因为看错题目,而迎来了一场血崩


A. Fair Game

思路:一开始害怕困难时轮流nim问题,看来半天,发现只有一步棋,那直接判就好咯

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;int a[maxn];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);        }        sort(a,a+n);        bool yes = true;        int a1 = a[0];        int a2 = a[n-1];        if(a1==a2)        {            yes = false;        }        for(int i=0;yes&&i<(n/2);i++)        {            if(a[i]!=a1)            {                yes = false;                break;            }        }        for(int i=(n/2);yes&&i<n;i++)        {            if(a[i]!=a2)            {                yes = false;                break;            }        }        if(yes)        {            printf("YES\n%d %d\n",a1,a2);        }        else        {            printf("NO\n");        }    }    return 0;}


B. Polycarp and Letters

思路:判断pretty position 由于n比较小,直接O(n^3)暴力了

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 1e5+10;char s[maxn];bool in[26];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        scanf("%s",s);        int maxsum = 0;        for(int i=0;i<n;i++)        {            for(int j=i;j<n;j++)            {                memset(in,false,sizeof(in));                int sum = 0;                for(int k=i;k<=j;k++)                {                    if(s[k]>='A'&&s[k]<='Z')                    {                        sum = 0;                        break;                    }                    if(!in[s[k]-'a'])                    {                        sum++;                        in[s[k]-'a'] = true;                    }                }                if(sum > maxsum)                {                    maxsum = sum;                }            }        }        printf("%d\n",maxsum);    }    return 0;}

c题看错题意,直接血崩,看样子像个单变量枚举,找时间再补吧

D. Make a Permutation!

思路:改变最少元素生成最小字典序全排列,那么先枚举位数,在同时双指针枚举数字,双管齐下,关键脑子一定要清晰

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <map>#include <cmath>#include <string>#include <queue>#include <stack>using namespace std;const int maxn = 2e5+10;int a[maxn];//posbool in[maxn];//numbool jump[maxn];//numint t[maxn];//numint main(){    int n;    while(scanf("%d",&n)!=EOF)    {        memset(t,0,sizeof(t));        memset(in,false,sizeof(in));        memset(jump,false,sizeof(jump));        int sum = 0;        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);            if(!in[a[i]])            {                in[a[i]] = true;                sum++;            }            t[a[i]]++;        }        int pos = 0;        int addnum = 1;        for(int pos=0;pos<n;pos++)        {            while(in[addnum])            {                addnum++;            }            if(jump[a[pos]])            {                t[a[pos]]--;                a[pos] = addnum;                addnum++;            }            else            {                if(t[a[pos]]>1)                {                    if(a[pos]<addnum)                    {                        jump[a[pos]] = true;                    }                    else                    {                        t[a[pos]]--;                        a[pos] = addnum;                        addnum++;                    }                }            }        }        printf("%d\n",n-sum);        for(int i=0;i<n-1;i++)        {            printf("%d ",a[i]);        }        printf("%d\n",a[n-1]);    }    return 0;}

文章地址:http://blog.csdn.net/owen_q/article/details/78089341

原创粉丝点击