Codeforces Round #613 (Div. 2)

题库链接

https://codeforces.com/contest/1285

A. Mezo Playing Zoma

一个机器人,收到系统的指令(只包含L和R),有些命令会被忽略,求可能停留的位置最多有多少个
假设有a个L,b个R,那最左边可以到达a,最右边可以到达b,再加上0,一共a+b+1个

#include <bits/stdc++.h>
using namespace std;
const int maxn = 201110;

char s[maxn];

int main()
{   
    int n;
    cin>>n;
    cin>>s;
    cout<<n+1<<endl;
    return 0;
}

B. Just Eat It!

有一个数组,求是否存在一个子数组的和大于等于整个数组的和
我们把数组看成两部分,前面和后面,前面 + 后面 = 总的数组和
当前面<=0时,后面>=总的数组和,同理,当后面<=0时,前面>=总的数组和


#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define cin(a) scanf("%d",&a)
#define pii pair<int,int>
#define ll long long
#define gcd __gcd
const int inf = 0x3f3f3f3f;
const int maxn = 201110;
const int M = 1e9+7;
int n,m,k,t;
 
ll a[maxn];
ll sum[maxn];
 
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("data.in", "r", stdin);
#endif
    int T;
    cin(T);
    while(T--)
    {
        cin(n);
        for(int i = 1; i <= n; i++) 
        {
            scanf("%lld",&a[i]);
            sum[i] =sum[i-1]+a[i];
        }
        bool flag = 0;
        for(int i = 1; !flag && i < n; i++) 
        {
            if(sum[i] <= 0) flag = 1;
        }
        ll temp = 0;
        for(int i = n; !flag && i > 1; i--) 
        {
            temp += a[i];
            if(temp <= 0) flag = 1;
        }
        if(flag) puts("NO");
        else puts("YES");
    }
    return 0;
}

C. Fadi and LCM

给定一个X,lcm(a,b) = x,对于所有满足的对中,找max(a,b)最小的
首先a和b肯定是互质的,其次我们可以枚举答案

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define cin(a) scanf("%d",&a)
#define pii pair<int,int>
#define ll long long
#define gcd __gcd
const int inf = 0x3f3f3f3f;
const int maxn = 201110;
const int M = 1e9+7;

int main()
{
    ll n;
    cin>>n;
    for(ll i = sqrt(n); i >= 1; i--)
    {   
        ll j = n/i;
        if(n%i == 0 && (gcd(i,j) == 1))
        {   
            cout<<i<<' '<<n/i<<endl;
            return 0;
        }
    }
    return 0;
}

D. Dr. Evil Underscores

找一个x,使得\(\underset{1 \leq i \leq n}{\max} (a_i \oplus X)\)最小,并且输出这个最大值,我一直以为是输出x,读错题目了,2333
假设这个最大值为ans,首先从高位开始,如果这一位只有0或者只有1,那么ans的这一位就可以是0,因为只要x对应的取0和1就行了
而如果这一位既有0又有1,那么ans的这一位一定会有1,因为不管你对应的x取0还是取1,都会留下一个1
但是我可以选择,如果我选择x的这一位为1,那么0变成1,1变成0,如果我选择x的这一位为0那么1变成1,0变成0,
我可以利用x把一个分支的当前位变为0,所以那个分支的最大值就不超过(1<<bit),所以我可以选择左右分支更小的那一个,希望我解释清楚了,还有不懂就留言吧

#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define cin(a) scanf("%d",&a)
#define pii pair<int,int>
#define ll long long
#define gcd __gcd
const int inf = 0x3f3f3f3f;
const int maxn = 201110;
const int M = 1e9+7;
int n,m,k,t;
 
vector<int> a;
 
int dfs(vector<int> &c, int bit)
{
    if(c.size() == 0 || bit < 0) return 0;
    vector<int> l,r;
    for(auto &i : c)
    {
        if( ((i>>bit)&1) == 0) l.push_back(i);      //0
        else r.push_back(i);                        //1
    }
    if(l.size() == 0) return dfs(r,bit-1);
    if(r.size() == 0) return dfs(l,bit-1);
    return min(dfs(l,bit-1),dfs(r,bit-1))+(1<<bit);
}
 
int main()
{
    cin>>n;
    for(int i = 1,x; i <= n; i++) 
    {
        cin>>x;
        a.push_back(x);
    }
    cout<<dfs(a,30)<<endl;
    return 0;
}

E. Delete a Segment


posted @ 2020-01-16 09:54  hezongdnf  阅读(130)  评论(0)    收藏  举报