Codeforces Round #353 (Div. 2) A,B,C,D

【A】

【题意】给了你a,b,c,现在这个数列第一项是a,公差是c,问你有没有可能这个数列中有一项为b?水题,分类讨论一下即可。

int main(){
    int a,b,c;
    while(scanf("%d%d%d",&a,&b,&c)){
        if(c==0){
            if(a==b){
                puts("YES");
            }else{
                puts("NO");
            }
        }else if(c>0){
            if(a>b){puts("NO");}
            else if(a==b){puts("YES");}
            else{
                if((b-a)%c==0){
                    puts("YES");
                }else{
                    puts("NO");
                }
            }
        }else{
            if(a<b){puts("NO");}
            else if(a==b){puts("YES");}
            else{
                if((a-b)%(-c)==0){
                    puts("YES");
                }else{
                    puts("NO");
                }
            }
        }
    }
    return 0;
}

【B】

【题意】给了一个9宫格,并且给了4个数,现在要求你找出剩下的数字有多少种排列方式,使得所有的2*2的方格里面的数等于最左上角的2*2的矩形的数的和。

【分析&解题思路】设最左上角的数x,中间那个数为y。解方程即可退出正确的解题姿势。

【AC代码】

#define ll long long
int n;
bool judge(int x){
    if(x>=1&&x<=n) return true;
    return false;
}
int main(){
    ll ans=0;
    int a,b,c,d;
    cin>>n>>a>>b>>c>>d;
    for(int i=1; i<=n; i++){
        if(judge(i+b-c)&&judge(i+a-d)&&judge(i+a+b-c-d))ans++;
    }
    cout<<(ll)ans*n<<endl;
    return 0;
}

【C】给了你n个数,保证这n个数的和是0,现在要你用最少的步数,使得所有的数都变成0,操作是可以把一个数加到相邻的另一个数上。

【分析&解题思路】选取尽量多的区间和为0的区间。因为,区间和为0了,里面就可以随便分配了。

【AC代码】

#define ll long long
map<ll,int>mp;
int main(){
    int n,now,ans=0;
    ll sum=0;
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>now;
        sum+=(ll)now;
        mp[sum]++;
        ans=max(ans,mp[sum]);
    }
    cout<<n-ans<<endl;
    return 0;
}

【D题意】在一颗排二叉树上来进行操作。我看了别人的题解,模仿了别人的解题代码。

【吐槽】以为是平衡树的,cf真是在不断刷新我的脑洞。。。

【AC代码】

#define ll long long
set<int>s;
map<int,int>lson,rson;
int main(){
    int n,now;
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>now;
        auto it=s.lower_bound(now);
        if(i==0)
            s.insert(now);
        else{
            if(it==s.end()) rson[*--it]=now;
            else{
                if(!lson[*it]) lson[*it]=now;
                else           rson[*--it]=now;
            }
            cout<<*it<<" ";
            s.insert(now);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值