April Fools Day Contest 2021

B. DMCA

思路:

给的样例不由得让人想到开根号上去,这题意思是每次把每一位加起来得到一个和,得到和之后再把这个和的每一位加起来,直到这个和只有个位数。

这东西叫数根。有关于他的性质和公式:

公式:(n - 1) % 9 + 1

性质:一个数加上9之后他的数根不变

不用公式做法:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <map>
#include <unordered_set>
#include <unordered_map>

#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 200010;
const double PI = acos(-1);

int a[N];

int solve(int n)
{
    int tmp = 0;
    while(n)
    {
        tmp += n % 10;
        n /= 10;
    }
    return tmp;
}

int main()
{
    IOS;
    int n;
    cin >> n;
    while(n / 10)//直到n只剩一位
        n = slove(n);

    cout << n << endl;
    return 0;
}

公式:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <map>
#include <unordered_set>
#include <unordered_map>

#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 200010;
const double PI = acos(-1);

int a[N];

int main()
{
    IOS;
    int n;
    cin >> n;
    cout << (n - 1) % 9 + 1 << endl;
    return 0;
}

 

C. Fibonacci Words

思路:

从题目名字能直到是让我们判断一个单词是不是斐波那契单词,类似于斐波那契数列,先把每个字母转化成0~25的数字,然后从第三位开始判断每一位是不是前两位的和就可以了,但要注意,由于每个字母都小于26,然后从ANNA这个样例我们能看出来,加完之后还要模26

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <map>
#include <unordered_set>
#include <unordered_map>

#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 200010;
const double PI = acos(-1);

int a[N];

int main()
{
    string s;
    cin >> s;
    bool flag = true;
    for (int i = 2; i < s.size(); i ++ )
        if(s[i] - 'A' != (s[i - 1] - 'A' + s[i - 2] - 'A') % 26) 
            {
                flag = false;
                break;
            }

        if (flag)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;

    return 0;
}
// help
// 7 4 11 15
// a b c d e f g h i j k l m n o p q r s t u v w x y z 

E. Cakewalk

思路:

乍一看是搜索,但最后给了个条件瞬间变贪心,首先老鼠要吃最短的,这里的最短路程是用的哈夫曼距离,然后如果路程相同,就优先吃行号较小的,可以用一个结构体存所有为星号的点,记录横纵坐标和哈夫曼距离,然后重载小于号排序,然后按只能走右下的条件遍历这个集合并记录答案

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <map>
#include <unordered_set>
#include <unordered_map>

#define x first
#define y second
#define IOS ios::sync_with_stdio(false);cin.tie(0);

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 10;
const double PI = acos(-1);

char g[N][N];

struct Node{
    int x, y, dist;
    bool operator< (const Node &t) const {
        if(dist == t.dist)
            return x < t.x;
        else
            return dist < t.dist;
    }
} tmp[N * N];

int main()
{
    int n, m;
    cin >> n >> m;
    int e = 0;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
        {
            cin >> g[i][j];
            if(g[i][j] == '*')
                tmp[++e] = {i, j, i - 1 + j - 1};
        }

    sort(tmp + 1, tmp + 1 + e);
    int res = 0;
    auto now = tmp[0];
    for (int i = 1; i <= e; i ++ )
    {
        if(tmp[i].y >= now.y && tmp[i].x >= now.x)//只能走右下
        {
            res++;
            now = tmp[i];
        }
        
    }
    cout << res << endl;

    return 0;
}

 

上一篇:C++零基础 | 超详细C++入门到入坟 | 〔3〕数据类型


下一篇:GRYZ10.27模拟赛解题报告