Codeforces Round 929 (Div. 3)

Problem A

思路分析

直接累计各元素绝对值即可

AC代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=2e5+10;
void solve(){
    int n,ans=0;
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        if(x>0)ans+=x;
        else ans-=x;
    }
    cout<<ans<<"\n";
}
int main(){
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

Problem B

思路分析

两种操作:去除一个元素,或者某个元素+1。
其实可以发现, s u m sum sum% 3 3 3结果只有 0 , 1 , 2 0,1,2 0,1,2.
0 : 0: 0直接输出0即可。
1 : 1: 1要不删去一个元素(其取模结果为1),要不加2,所以可以用个 f l a g flag flag,看看有没有这样的元素存在。
2 : 2: 2要不删去一个元素,要不加1,无所谓,都是两次操作。

AC代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=1e5+10;
void solve(){
    int n,flag=0;cin>>n;
    ll sum=0;
    for(int i=1;i<=n;i++){
        int x;cin>>x;
        if(x%3==1)flag=1;
        sum+=x;
    }
    if(sum%3==0)cout<<0<<"\n";
    else if(sum%3==2)cout<<1<<"\n";
    else{
        if(flag)cout<<1<<"\n";
        else cout<<2<<"\n";
    }
}
int main(){
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

Problem C

思路分析

坐牢的开始qwq,自己想得太复杂了,其实直接用快速幂枚举 x , y x,y x,y即可(看了队里大佬的代码)。
这里去重有个小技巧,可以用 s e t set set,这样就可以不用写判断是否重复的条件(set可以直接去重),最后输出 s e t . s i z e ( ) set.size() set.size()即可。

AC代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=2e5+10;
int quickpower(int a,int n){
    int ans=1;
    while(n){
        if(n&1)ans*=a;
        n>>=1;
        a*=a;
    }
    return ans;
}
void solve(){
    int a,b,l;cin>>a>>b>>l;
    set<int> s;
    for(int x=0;quickpower(a,x)<=l;x++){
        //注意y的枚举条件是quickpower(a,x)*quickpower(b,y)<=l
        for(int y=0; quickpower(a,x)*quickpower(b,y)<=l;y++){
            int num=quickpower(a,x)* quickpower(b,y);
            if(l%num==0){
                //将l/num存入set中
                s.insert(l/num);
            }
        }
    }
    cout<<s.size()<<"\n";
}
int main(){
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

Problem D

思路分析

看看样例,可以大胆猜测一下,先从小到大排序,可以发现, S m a l l E l e m e m t SmallElememt SmallElememt% B i g E l e m e m t BigElememt BigElememt肯定不为0,那么这样贪心排序下来,如果可以得到结果不为0,满足题意,直接 r e t u r n return return即可。
但是,需要特判是否有相同的情况,只需要考虑 a 0 、 a 1 a_0、a_1 a0a1即可,后面是否连续无影响,如果 a 0 = = a 1 a_0==a_1 a0==a1,则不满足题意。

AC代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=1e5+10;
void solve(){
    int n;cin>>n;
    vector<int>a(n);
    for(int i=0;i<n;i++)cin>>a[i];
    //元素按照从小到大排序
    sort(a.begin(),a.end());
    //特判
    if(a[1]!=a[0]){
        cout<<"YES\n";
        return;
    }
    for(int i=1;i<n;i++){
        //如果%!=0,输出yes
        if(a[i]%a[0]!=0){
            cout<<"YES\n";
            return;
        }
    }
    cout<<"NO\n";
}
int main(){
    ios::sync_with_stdio(0);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

Problem E

明天再补qwq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值