Codeforces Round #613 (Div. 2)(A-D)

A. Mezo Playing Zoma

题意:有“L”和“R”指令,L表示向左移动一位,R则向右移动一位,但有时指令会出现故障,导致该命令没有执行,就在原地不动,问最大的可能移动区间为多少。

解:统计L和R的个数。ans=L+R+1;

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
char a[MAXN];
int main(){
    int n;
    cin>>n;
    cin>>a;
    int r=0;
    int l=0;
    for(int i=0;i<n;i++){
        if(a[i]=='R')r++;
        else if(a[i]=='L')l++;
    }
    cout<<l+r+1<<endl;
    return 0;
}
View Code

B. Just Eat It!

题意:有两个人去到shop买东西,有n个东西,A会把所有东西都买一遍,而B就会选择一个区间购买(该区间不能跟全集相同),问A的购买价值是否严格大于B。
解:第一想法:对于B求最大子段和,然后和A比较。
因为不能选择全集,所以就应该分成两部分来求最大子段和,
1,n-1)和(2,n)来求最大字段和,这样就不会选择全集了。

dp[i]=max(dp[i-1],0)+a[i]

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
typedef long long ll;
ll a[MAXN],n;
ll gao(int l,int r){
    ll pre[MAXN];
    pre[0]=pre[1]=0LL;
    ll res=0;
    for(int i=l;i<=r;i++){
        pre[i]=max(pre[i-1],0LL)+a[i];
        res=max(pre[i],res);
    }
    return res;
}
int main(){
    int T;
    cin>>T;
    while(T--){
        cin>>n;
        ll sum=0LL;
        for(int i=1;i<=n;i++)cin>>a[i],sum+=a[i];
        ll res=max(gao(1,n-1),gao(2,n));
        if(res>=sum)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
 
    }
 
 
    return 0;
}
View Code

C. Fadi and LCM

题意:给一个x,求 最小的 max(a,b)满足lcm(a,b)==x。
解:因为a,b的lcm是x,所以a,b一定是x的因子,所以把x暴力分解了。
然后把因子拿出来再求一遍lcm,是x就是答案了~

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
ll x;
vector<ll>vec;
int main(){
    cin>>x;
    for(int i=1;i<=sqrt(x);i++){
        if(x%i==0){
            vec.push_back(x/i);
        }
    }
    sort(vec.begin(),vec.end());
    for(int i=0;i<vec.size();i++){
        ll a=x/vec[i];
        ll b=vec[i];
        if(a/__gcd(a,b)*b==x){
            cout<<a<<' '<<b<<endl;
            return 0;
        }
    }
 
    return 0;
}
View Code

D. Dr. Evil Underscores

题意:求一个数X于数组中的每个元素异或后的最大值最小,求最大值。
解:首先要知道异或运算是一个二进制加法不进位的运算。
1^1=0 0^0=0 1^0=1 0^1=1

从高位开始求,假设当前是第k位:
1.数组中的每个数都是0或者是1,那么答案中的第k位一定是0,因为我们选择x的第k位跟数组中的第k位一样就可以获得异或后答案第k位是0.
2.数组中的每个数有1又有0,那么答案位一定是1,不管你x的第k位取得什么样的值,异或后的结果都是1。然后取最小的值对于剩下的k-1位。

看一些dalao的题解:字典树贪心好像差不多都一样

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
ll gao(vector<int> &vec,int now){
    if(now<0 || vec.size()==0){
        return 0;
    }
    vector<int>p,q;
    for(int i=0;i<vec.size();i++){
        if((vec[i]>>now)&1){
            p.push_back(vec[i]);
        }
        else{
            q.push_back(vec[i]);
        }
    }
    if(p.size()==0)return gao(q,now-1);
    if(q.size()==0)return gao(p,now-1);
    return (1LL<<now)+min(gao(q,now-1),gao(p,now-1));

}
int main(){
    int n;
    cin>>n;
    vector<int>vec;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        vec.push_back(x);
    }
    cout<<gao(vec,30)<<endl;
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/lin1874/p/12194103.html