Codeforces Round #451 (Div. 2)题解

来源:互联网 发布:菲律宾跳水队 知乎 编辑:程序博客网 时间:2024/06/05 14:09

比赛时间

2017 12 16 19:35-21:35。

结果

+133rating。

感想

这是第一次打cf,两个小时实际上因为回寝时间只打了一个半小时。
总共六道题写了五道,感觉还可以,英文直接看(借助有道词典)大多也能看懂。
最后+133rating还是挺高兴的,也没有被hack掉(当然也没时间hack别人)。

题解

A Rounding

一个简单的四舍五入,没啥好说。

#include<bits/stdc++.h>#include<cstdio>using namespace std;long long n;int main(){    cin>>n;//不能%lld真的很奇怪?    if(n%10>=5)n=(n/10+1)*10;    else n=n/10*10;    cout<<n;    return 0;}

B Proper Nutrition

一眼ex-gcd,两眼暴力加模拟。

#include<bits/stdc++.h>using namespace std;int n,a,b;int read(){    int num=0;char c=getchar();    for(;c<'0'||c>'9';c=getchar());    for(;c>='0'&&c<='9';c=getchar()) num=(num<<3)+(num<<1)+c-48;    return num;}void end(){    printf("NO");    exit(0);}int main(){    n=read();a=read();b=read();    for(int i=0;;++i){        if(1LL*i*a>n)end();        if((n-i*a)%b==0){            printf("YES\n");            printf("%d %d\n",i,(n-i*a)/b);            exit(0);        }    }    return 0;}

C Phone Numbers

绝妙的暴力+字符串处理。

#include<bits/stdc++.h>using namespace std;struct people{    int num;    string in,s[1000];}p[25];int n,cnt;string s;int read(){    int num=0;char c=getchar();    for(;c<'0'||c>'9';c=getchar());    for(;c>='0'&&c<='9';c=getchar()) num=(num<<3)+(num<<1)+c-48;    return num;}void init(){    n=read();    for(int i=1;i<=n;++i){        cin>>s;int j,t;        for(j=1;j<=cnt;++j) if(p[j].in==s)break;        p[j].in=s;        cnt=max(cnt,j);        t=read();        for(int k=1;k<=t;++k) cin>>p[j].s[p[j].num+k];        p[j].num+=t;    }    for(int i=1;i<=cnt;++i){        for(int j=1;j<=p[i].num;++j)            for(int k=1,flag=1;k<=p[i].num;++k){                int lena=p[i].s[j].length();                int lenb=p[i].s[k].length();                flag=1;                if(j==k) continue;                if(!lena||!lenb)continue;                if(lena<lenb) continue;                for(int o=1;o<=lenb;++o)                    if(p[i].s[j][lena-lenb+o-1]!=p[i].s[k][o-1]){                        flag=0;                        break;                    }                if(!flag)continue;                p[i].s[k]="";            }    }    printf("%d\n",cnt);    for(int i=1;i<=cnt;++i){        cout<<p[i].in<<' ';        int temp=0;        for(int j=1;j<=p[i].num;++j)            if(p[i].s[j]!="")++temp;        printf("%d",temp);        for(int j=1;j<=p[i].num;++j)            if(p[i].s[j]!="")                cout<<' '<<p[i].s[j];        printf("\n");    }}int main(){    init();    return 0;}

D Alarm Clock

贪心与查分思想的简单运用。

#include<bits/stdc++.h>using namespace std;int n,m,k,sum=0,ans,maxx,flag[1000010]={};int read(){    int num=0;char c=getchar();    for(;c<'0'||c>'9';c=getchar());    for(;c>='0'&&c<='9';c=getchar()) num=(num<<3)+(num<<1)+c-48;    return num;}void work(){    n=read();m=read();k=read();    for(int i=1;i<=n;++i){        int x=read();        maxx=max(maxx,x);        flag[x]=1;    }    for(int i=1;i<=maxx;++i){        if(i>=m)sum-=flag[i-m];        sum+=flag[i];        if(sum>=k){            ++ans;            --sum;            flag[i]=0;        }    }    printf("%d",ans);}int main(){    work();    return 0;}

E Squares and not squares

计算两种情况的花费之后用了两个队列,每次取更小的队头。

#include<bits/stdc++.h>using namespace std;struct point{    int lo,hi,in;    int yes,no;}a[200010];int n,b[200010],c[200010];long long ans=0;int read(){    int num=0;char c=getchar();    for(;c<'0'||c>'9';c=getchar());    for(;c>='0'&&c<='9';c=getchar()) num=(num<<3)+(num<<1)+c-48;    return num;}void init(){    n=read();    for(int i=1;i<=n;++i){        a[i].in=read();        int lo=(int)sqrt(a[i].in);        int hi=lo+1;        a[i].lo=a[i].in-lo*lo;        a[i].hi=hi*hi-a[i].in;        a[i].yes=min(a[i].lo,a[i].hi);        if(a[i].lo&&a[i].hi)a[i].no=0;        else a[i].no=a[i].in?1:2;    }}void work(){    for(int i=1;i<=n;++i){        b[i]=a[i].yes;        c[i]=a[i].no;    }    sort(b+1,b+n+1);    sort(c+1,c+n+1);    int hb=1,hc=1;    while(hb<=n/2||hc<=n/2){        //printf("%d %d %d %d\n",hb,hc,b[hb],c[hc]);        if(hb>n/2){            ans+=c[hc];            ++hc;        }else if(hc>n/2){            ans+=b[hb];            ++hb;        }else if(b[hb]<c[hc]){            ans+=b[hb];            ++hb;        }else{            ans+=c[hc];            ++hc;        }    }    cout<<ans;}int main(){    init();    work();    return 0;}

F Restoring the Expression

暂时还没有做过。