AtCoder Beginner Contest 136(A-D)

前三道很容易,这里详细讲解了D题的做题思路,如果想直接看D题的话请往下滑。

A:

#include 
using namespace std;
#define ll long long
const int MAXN = 1e5 + 7;

int main()
{
    ios::sync_with_stdio(0);
    int a, b, c;
    cin>>a>>b>>c;
    a = a-b;
    c = c>a ? c-a : 0;
    cout<

B:

#include 
using namespace std;
#define ll long long
const int MAXN = 1e5 + 7;

int main()
{
    ios::sync_with_stdio(0);
    int n, x = 10, ans = 0;
    cin>>n;
    for(int i = 1; i <= n; i++)
    {
        if(i >= x)
        {
            x *= 10;
            i = x;
            x *= 10;
        }
        if(i <= n) ans++;
    }
    cout<

C:

注意2221这种情况时候也是yes。

#include 
using namespace std;
#define ll long long
const int MAXN = 1e5 + 7;

int arr[MAXN];

int main()
{
    ios::sync_with_stdio(0);
    //while(1){
    int n, flag = 0;
    cin>>n;
    arr[0] = 0;
    for(int i = 1; i <= n; i++)
    {
        cin>>arr[i];
    }
    for(int i = 1; i <= n; i++)
    {
        if(arr[i-1] - arr[i] == 1)
            arr[i-1]--;
        else if(arr[i] == arr[i-1] && arr[i] > arr[i-2])
            arr[i-1]--;
        else if(arr[i] < arr[i-1] && arr[i-1] - arr[i] > 1)
        {
            flag = 1;
            break;
        }
    }
    for(int i = 1; i <= n; i++)
    {
        if(arr[i] < arr[i-1])
        {
            flag = 1;
            break;
        }
    }
    if(flag) cout<<"No"<

D:

这道题有点意思,题目开始一直以为是每个广场都有一个小孩抱着一个正方形的盒子跑,一直读不懂,结果后来细读发现,哪来的盒子???

题意就是给一个R开头L结尾只包括R和L的字符串,然后有字符串长的广场,每个广场一个小孩,每个小孩需要按照地标走(地标就是当前位置的字符,R向右,L向左),问你走10^100次后每个广场的孩子人数。

我觉得是一道思维题,模拟几遍后发现只有在RL的交界处才会有孩子,而当一个子集(例如RRRRLL)中如果R+L是偶数,那么就把和平分到最后一个R和第一个L。如果是奇数就需要找到是R最后大还是L最后大了。

这里我把推规律的过程记录一下:

                  R R L                 R R R L L                         R R R R R L L

    0:           1  1  1                1  1  1 1  1                        1  1  1 1  1  1 1

    1:           0  2  1                0  1  2 2  0                        0  1  1 1  2  2 0

    2:           0  1  2                0  0  3 2  0                        0  0  1 1  3  2 0

    3:           0  2  1                0  0  2 3  0                        0  0  0 1  3  3 0

    4:           0  1  2                0  0  3 2  0                        0  0  0 0  4  3 0

由此我们可以发现,当r > l && (r - l)%2 == 1 时,如果l%2 == 0,r比l大1;否则l比r大1。同理可推到l > r的情况。

代码:

#include 
using namespace std;
#define ll long long
const int MAXN = 1e5 + 7;

int arr[MAXN];
int main()
{
    ios::sync_with_stdio(0);
    string s;
    cin>>s;
    int len = s.size();
    int r, l;
    memset(arr, 0, sizeof arr);
    for(int i = 0; i < len; i++)
    {
        l = 0, r = 0;
        if(s[i] == 'R')
        {
            r++;
            int x, y;
            for(int j = i+1; j < len; j++)
            {
                if(s[j] == 'R')
                    r++;
                else
                {
                    x = j;
                    break;
                }
            }
            for(int j = x; j < len; j++)
            {
                if(s[j] == 'L')
                    l++;
                if(s[j] == 'R' || j == len - 1)
                {
                    //cout<l && (r-l)%2 == 1)
                    {
                        if(l%2 == 1)
                            arr[x]++;
                        else arr[x-1]++;
                    }
                    else if(l>r && (l-r)%2 == 1)
                    {
                        if(r%2 == 1)
                            arr[x-1]++;
                        else arr[x]++;
                    }
                    y = j;
                    break;
                }
            }
            i = y-1;
            if(y == len - 1) i++;
        }
    }
    for(int i = 0; i < len; i++)
    {
        cout<

 

你可能感兴趣的:(AtCoder)