【Codeforces】Round #491 (Div. 2) 总结

【Codeforces】Round #491 (Div. 2) 总结


这次尴尬了,D题fst,E没有做出来。。。。

不过还好,rating只掉了30,总体来说比较不稳,下次加油


A:If at first you don’t succeed…

这里写图片描述
这里写图片描述


SB题,就是注意一下特判就好了,然后我一开始wa了三次。。。

#include<bits/stdc++.h>
using namespace std;
int read(){
    int ans=0,w=1;char c=getchar();
    while(!isdigit(c)&&c!='-')c=getchar();
    if(c=='-')c=getchar(),w=-1;
    while(isdigit(c))ans=ans*10+c-'0',c=getchar();
    return ans*w;
}
int main(){
    int a=read(),b=read(),c=read(),d=read();
    if(a+b-c>=d||a>d||b>d||c>d||c>a||c>b){
        cout<<"-1";
    }else cout<<d-a-b+c;
    return 0;
} 

B:Getting an A

这里写图片描述

比较稳过的一题
排序,从最小的一位开始贪心

#include<bits/stdc++.h>
using namespace std;
int read(){
    int ans=0,w=1;char c=getchar();
    while(!isdigit(c)&&c!='-')c=getchar();
    if(c=='-')c=getchar(),w=-1;
    while(isdigit(c))ans=ans*10+c-'0',c=getchar();
    return ans*w;
}
double a[110];
int n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    sort(a+1,a+n+1);
    double sum=0;
    for(int i=1;i<=n;i++)sum+=a[i];
    int ans=0;double minv=4.5*(double)n; 
    while(sum<minv){
        ans++;
        sum=sum-a[ans]+5;
    }
    cout<<ans;
    return 0;
} 

C:Candies

这里写图片描述
这里写图片描述

虽然我也不知道复杂度是什么,但是二分+check可以稳过,只用枚举k然后暴力检查就好,一开始因为二分写挂T了,后面顺利AC

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL n;
bool check(LL w,LL p){
    LL tmp=0,pic=p;
    while(pic>0){
        if(w>=pic){
            tmp+=pic;
            return tmp*2>=p;
        }
        tmp+=w;
        pic-=w;
        pic-=pic/10;
        if(tmp*2>=p)return 1;
    }
    return 0;
}
void solve(LL p){
    LL l=1,r=p,ans=0;
    while(l<=r){
        LL mid=(l+r)>>1;
        if(check(mid,p))r=mid-1,ans=mid;
        else l=mid+1;
    }
    cout<<ans<<endl;
}
int main(){
    cin>>n;
    solve(n);
    return 0;
} 

D:Bishwock

这里写图片描述
这里写图片描述

DP很裸,就是需要注意一下当有连续三个位置(包含两个字符串)都是空的,可以放进两个

000 -> XX + 0X = XXX
000 -> X0 + XX = XXX

#include<bits/stdc++.h>
using namespace std;
int f[110]={0};
char c[2][110];
int mx[4]={0,0,1,1};
int my[4]={0,1,0,1};
bool check(int pos,int id){
    for(int i=0;i<4;i++){
        if(i==id)continue;
        int nx=pos-mx[i],ny=1-my[i];
        if(c[ny][nx]=='X')return 0;
    }
    return 1;
}
bool emp(int pos){
    return c[0][pos]=='0'&&c[1][pos]=='0';
}
int main(){
    scanf("%s%s",c[0],c[1]);
    int n=strlen(c[0]);
    for(int i=1;i<n;i++){
        f[i]=f[i-1];
        for(int j=0;j<4;j++)
            if(check(i,j))f[i]=max(f[i],f[i-2]+1);
        if(i>=2&&emp(i)&&emp(i-1)&&emp(i-2))f[i]=max(f[i],f[i-3]+2); 
    }
    cout<<f[n-1];
    return 0;
} 

E:Bus Number

这里写图片描述
这里写图片描述


F:Concise and clear

这里写图片描述
这里写图片描述

转载于:https://www.cnblogs.com/dream-maker-yk/p/9676370.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值