zoukankan      html  css  js  c++  java
  • VK Cup 2017

    因为资格赛1已经通过了,资格赛2随便打打玩。这次题目比上次还简单,FallDream看了两眼觉得太水就不做了,我一个人闲着无聊只好默默做了

    A. Новый пароль

    题目大意:给出N和K,要求构造一个长为N,出现K种字符,相邻字符不相同的字符串。(2<=K<=N<=100,K<=26)

    思路:第i个字符输出i%K+'a'。

    #include<cstdio>
    int main()
    {
        int n,k,i;
        scanf("%d%d",&n,&k);
        for(i=0;i<n;++i)putchar('a'+i%k);
    }

    B. Максимизируй сумму цифр

    题目大意:给出N,求不超过N的各位数字和最大的数字。(N<=10^18)

    思路:枚举一个非零位减一,后面全部换成9,更新答案。

    #include<iostream>
    #define ll long long
    using namespace std;
    int p[20];
    void ts(ll x){for(int i=0;x;++i,x/=10)p[i]=x%10;}
    ll ti(){ll r=0;for(int i=20;i--;)r=r*10+p[i];return r;}
    int sum(){int r=0;for(int i=0;i<20;++i)r+=p[i];return r;}
    int main()
    {
        ll x,ans;int i,j,mx;
        cin>>x;ts(ans=x);mx=sum();
        for(i=1;i<20;++i)if(p[i])
        {
            for(--p[i],j=0;j<i;++j)p[j]=9;
            if(sum()>mx)mx=sum(),ans=ti();
        }
        cout<<ans;
    }

    C. Онлайн-курсы в БГУ

    题目大意:共有N门课程,每门课程学之前必须学一些其他课程,一个人要学K门课程,要求构造一个学的课程最少的方案,按顺序输出,没有方案输出-1。(N<=100000,所有课程学之前必须学的加起来不超过100000个)

    思路:先建反图BFS出所有必须学的,然后拓扑排序。

    #include<cstdio>
    char B[1<<26],*S=B,C;int X;
    inline int read()
    {
        while((C=*S++)<'0'||C>'9');
        for(X=C-'0';(C=*S++)>='0'&&C<='9';)X=(X<<3)+(X<<1)+C-'0';
        return X;
    }
    #define MN 100000
    struct edge{int nx,t;}e[MN*2+5];
    int h[MN+5],rh[MN+5],en,q[MN+5],qn,u[MN+5],r[MN+5];
    inline void ins(int*h,int x,int y){e[++en]=(edge){h[x],y};h[x]=en;}
    int main()
    {
        fread(B,1,1<<26,stdin);
        int n,i,j,x;
        n=read();qn=read();
        for(i=1;i<=qn;++i)u[q[i]=read()]=1;
        for(i=1;i<=n;++i)for(j=read();j--;)ins(h,x=read(),i),ins(rh,i,x);
        for(i=1;i<=qn;++i)for(j=rh[q[i]];j;j=e[j].nx)if(!u[e[j].t])u[q[++qn]=e[j].t]=1;
        for(i=1;i<=n;++i)if(u[i])for(j=h[i];j;j=e[j].nx)++r[e[j].t];
        for(x=qn,qn=0,i=1;i<=n;++i)if(u[i]&&!r[i])q[++qn]=i;
        for(i=1;i<=qn;++i)for(j=h[q[i]];j;j=e[j].nx)if(u[e[j].t]&&!--r[e[j].t])q[++qn]=e[j].t;
        if(qn<x)return puts("-1"),0;
        printf("%d
    ",x);
        for(i=1;i<=x;++i)printf("%d ",q[i]);
    }

    D. Нарисуй скобки!

    题目大意:给你一个长为N的括号序列,要求你把它……画出来……(N<=100)

    思路:大模拟()

    #include<cstdio>
    #define MN 100
    #define ML 250
    char s[MN+5],ans[MN+5][ML+5];
    int main()
    {
        int n,i,j,p,l,r;
        scanf("%d%s",&n,s);
        for(i=l=r=0;i<n;++i,r=l>r?l:r)l+=s[i]=='['?2:-2;
        for(i=p=0;i<n;++i,++p)
        {
            ans[l][p]=ans[r][p]='+';
            for(j=l+1;j<r;++j)ans[j][p]='|';
            if(s[i]=='[')ans[l][p+1]=ans[r][p+1]='-';
            if(s[i]==']')ans[l][p-1]=ans[r][p-1]='-';
            if(s[i]=='['&&s[i+1]=='[')++l,--r;
            if(s[i]=='['&&s[i+1]==']')p+=3;
            if(s[i]==']'&&s[i+1]==']')--l,++r;
        }
        for(i=0;i<=r;++i,puts(""))for(j=0;j<p;++j)putchar(ans[i][j]?ans[i][j]:' ');
    }
  • 相关阅读:
    产生财务计帐周期
    判断指定年份是否为闰年
    判断是否是闰年
    Regex quick reference
    组合外键(FOREIGN KEY)
    多列组合为主键(PRIMARY KEY)
    获取字符串开始的地址(案例)
    获取字符串结尾的电话号码(案例)
    ms sql server line feed
    如何产生连续时间?(案例)
  • 原文地址:https://www.cnblogs.com/ditoly/p/VK-Cup-2017-Q2.html
Copyright © 2011-2022 走看看