省赛训练赛赛题(简单题)

小明的快乐
 

Description

某天早上,小明突然发现自己家里多了两个售货机A和B,如果向A机器中放入a枚硬币,A机器会吐出来2a+1枚硬币。如果向B机器投入a枚硬币,B机器会吐出来2a+2枚硬币,现在小明想获得n枚硬币,请你输出使用机器的顺序。

注:开始时小明是没有硬币的。

 

Input

 

输入一行n(1 ≤n≤ 100000000).

 

Output

 

输出一行由A和B组成的字符串,代表使用机器的顺序。

 

Sample Input 1 

7

Sample Output 1

AAA

Sample Input 2 

10

Sample Output 2

ABB

Hint

 对于样例1:硬币变化为0->1->3->7.
省赛训练赛赛题(简单题)_第1张图片

 

 AC代码:

#include
#define int long long 
using namespace std;
string str,str1;
int f;

void fun(int n)
{
    if(n == 0)
        return;
    int temp = (n - 1) % 2;
    f = (n - 1) / 2;
    if(temp == 0)
    {
        str.append("A");
        fun(f);
    }
    else
    {
        str.append("B");
        fun(f);
    }
}

signed main()
{
    int n;
    cin >> n;
    fun(n);
    int len =  str.length();
    for(int i = len - 1;i >= 0;i--)
        cout << str[i];
    return 0;
}
小明的神奇矩阵
 

Description

 

今天上课老师给小明了几个n*m的矩阵,她希望小明能找到规律,并能举一反三,成为班级最聪明的人,你能帮他完成吗?

老师给的矩阵如下:

3*3::

4*4:

3*2:

 

Input

 

输入共一行,包含两个整数n和m。(1≤n,m≤1000)

 

Output

 

输出满足要求的矩阵。注:每行最后一个数的后面没有空格

 

Sample Input 1 

3 3

Sample Output 1

1 2 3
8 9 4
7 6 5
省赛训练赛赛题(简单题)_第2张图片

 

 AC代码:

#include
#define long long int
using namespace std;
int num[1001][1001];

signed main()
{
    int n,m;
    cin >> m;
    cin >> n;
    int count = 1;
    int x = 0, y = 0;
    int dx = 0, dy = 1;
    if(m == 1)
    {
        for(int i = 0;i < n;i++)
        {
            if(i != n - 1)
                cout << i + 1 << " ";
            else
                cout << i + 1;
        }
    }else if(n == 1)
    {
        for(int i = 0;i < m;i++)
        {
            if(i != m - 1)
                cout << i + 1 << endl;
            else
                cout << i + 1;
        }
    }
    else
    {
        while (count <= m * n)
        {
            num[x][y] = count;
            x += dx;
            y += dy;
            if (dy == 1 && (y >= n - 1 || num[x][y+1] != 0))
            {
                dx = 1;
                dy = 0;
            }
            else if (dx == 1 && (x >= m - 1 || num[x+1][y] != 0))
            {
                dx = 0;
                dy = -1;
            } 
            else if (dy == -1 && (y <= 0 || num[x][y-1] != 0))
            {
                dx = -1;
                dy = 0;
            } 
            else if (dx == -1 && (x <= 0 || num[x-1][y] != 0))
            {
                dx = 0;
                dy = 1;
            }
            count++;
        }
        for(int i=0;i//输出矩阵
        {
            for(int j=0;j)
            {
                if(j != n - 1)
                    cout << num[i][j] << " ";
                else
                    cout << num[i][j];
            }
            if(i != m - 1)
                cout << endl;
        }
    }
    return 0;
}
有趣的区间
 

Description

 

小王老师最近迷上了区间问题。

有一次,小王老师为了考考同学们,在黑板上出了一道智力题。

他在黑板上写下了N个数,分别是A1,A2,A3...An.然后他问问大家在这串数中有多少个区间满足区间的和为K。

【即有多少个连续非空的序列Al,A(l+1),A(l+2)...Ar的和为K(l<=r)】

请你告诉他。

 

Input

 

第一行是两个正整数 N,K(1<=N<=200000,-pow(10,14)<=K<=pow(10,14)),分别代表数组长度和需满足条件的K。

第二行输入N个数,分别是A1,A2,A3...An。(-pow(10,9)<=Ai<=pow(10,9))

 

Output

 

输出一行整数,表示在数组中有多少个区间满足区间和为K.

 

Sample Input 1 

6 3
3 -2 -1 1 1 2

Sample Output 1

3

Hint

三个区间分别是【A1-->A1】,【A3-->A6】,【A5-->A6】

省赛训练赛赛题(简单题)_第3张图片

 

 AC代码:

#include
#define long long int
#define N 200000
using namespace std;
int a[N];

signed main()
{
    int n,k,flag = 0;
    cin >> n >> k;
    for(int i = 1;i <= n;i++)
    {
        cin >> a[i];
        if(a[i] == k)
            flag++;
    }
    
    for(int i = 1;i <= n;i++)
    {
        int temp = a[i];
        for(int j = i + 1;j <= n;j++)
        {
            temp += a[j];
            if(temp == k)
                flag++;
        }
    }
    cout << flag << endl;
    return 0;
}
 

你可能感兴趣的:(省赛训练赛赛题(简单题))