Codeforces Round #451 (Div. 2)题解

比赛时间

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

暂时还没有做过。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值