比赛网址:http://codeforces.com/contest/1285

A

题面:

输入一个长度为n的字符串(仅有L和R组成),代表机器人在x坐标轴上的移动指令,该机器人可能忘掉了部分指令,问你机器人最后能落在多少不同的位置?

solution:

记录L和R的个数,答案即为L+R+1(其实也可以直接输出n+1)

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    int n,cnt1 = 0,cnt2 = 0;
    cin>>n;
    string s;
    cin>>s;
    for(int i=0;i<n;i++)
    {
        if(s[i] == 'L')
            cnt1++;
        else
            cnt2++;
    }
    cout<<cnt1+cnt2+1<<endl;
    return 0;
}

B

题面:

给出一个长度为n的数组,代表n块面包的美味值,A要买完所有的面包,B可以买任意连续子序列的面包,但是不能全部都买,问你是否能使B的美味值大于等于A?

solution:

很明显,我们要找到[1,n-1]和[2,n]的最大连续子序列和然后和[1,n]的和比较即可

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100005;
ll a[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,flag = 0;
        ll sum = 0;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            sum += a[i];
        }
        ll sum1 = 0,sum2 = 0,maxx = -1e9;
        for(int i=1;i<n;i++){
            sum1 += a[i];
            if(a[i] > sum1)
                sum1 = a[i];
            maxx = max(maxx , sum1);
        }
        for(int i=2;i<=n;i++){
            sum2 += a[i];
            if(a[i] > sum2)
                sum2 = a[i];
            maxx = max(maxx , sum2);
        }
        if(maxx >= sum)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}

C

题面:

输入n,输出a b,满足a和b的最小公倍数 = n,而且最小化max(a,b)

solution:

从sqrt(n)遍历,找到__gcd(a,b) == 1 的即为答案,如果gcd不等于1,那么最小公倍数肯定也不等于n

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll n;
    int flag = 0;
    cin>>n;
    ll sq =sqrt(n);
    for(ll i=sq; ;i--)
    {
        if(n%i == 0){
            ll x = i;
            ll y = n/i;
            if(__gcd(x,y) == 1){
                flag = 1;
                cout<<x<<" "<<y<<endl;
                break ;
            }
        }
        if(flag)
            break ;
    }
    return 0;
}

D

题面:

给出一个大小为n的数组a1~an,请找到最佳的x,满足max(ai^x)最小(1<=i<=n),输出最小的max(ai^x)

solution:

这题没做出来,知道是二进制贪心,但是写不出来,不知道怎么处理01同时存在同一位上的情况,看了题解明白了,如果某一个位置上全部都是0或者全部都是1,那这一位肯定都是0,如果0和1同时存在,我们取min(这一位是0,这一位是1) + (1<<i)

std:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100005;
int a[maxn];
int dfs(int i,vector<int> &v){
    vector<int> v0,v1;
    if(i < 0)
        return 0;
    for(int j=0;j<v.size();j++){
        if((v[j]>>i)&1)
            v1.push_back(v[j]);
        else
            v0.push_back(v[j]);
    }
    if(v0.size() == 0)
        return dfs(i - 1,v1);
    if(v1.size() == 0)
        return dfs(i - 1,v0);
    return min(dfs(i-1 , v0) , dfs(i-1 ,v1))+(1<<i);
}
vector<int> v;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        v.push_back(a[i]);
    }
    cout<<dfs(30 , v);
    return 0;
}