2022暑假每日一题笔记(四)

T1--3537. 树查找

给定一棵包含 n 个结点(编号 1∼n)的完全二叉树的层序遍历序列,请按照从左到右的顺序输出该树第 k 层的全部结点编号。

输入格式
第一行包含整数 n。
第二行包含 n 个整数,表示该二叉树的层序遍历序列。
第三行包含整数 k。

输出格式
共一行,按照从左到右的顺序输出该树第 k 层的全部结点编号。
数与数之间用单个空格隔开。
若无该层结点,则输出 EMPTY。

数据范围
1≤n≤10001≤k≤20
输入样例:
4
1 2 3 4
2
输出样例:
2 3
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int n,m;
int q[N];

int main(){
    cin >> n;
    for (int i = 1;i <= n;i ++) cin >> q[i];
    cin >> m;
    
    if (1 << (m-1) > n) cout << "EMPTY\n";
    else{
        for (int i = 1 << (m-1);i < (1 << m) && i <= n;i ++){
            cout << q[i] << ' ';
        }
    }
    return 0;
}

T2--3564. 日期类

编写一个日期类,要求按 xxxx-xx-xx 的格式输出日期,实现加一天的操作。

输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据占一行,包含 3 个用空格隔开的整数,分别表示年月日。

输出格式
每组数据输出一行,一个结果,按 xxxx-xx-xx 的格式输出,表示输入日期的后一天的日期。

数据范围
输入日期保证合法且不会出现闰年。
年份范围 [1000,3000]
输入样例:
2
1999 10 20
2001 1 31
输出样例:
1999-10-21
2001-02-01
#include <bits/stdc++.h>
using namespace std;
int day[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

int main(){
    int t,y,m,d;
    cin >> t;
    while (t --){
        cin >> y >> m >> d;
        
        d ++;
        if (d > day[m]) d = 1,m ++;
        if (m > 12) m = 1,y ++;
        printf("%d-%02d-%02d\n",y,m,d);
    }
    
    return 0;
}

T3--3625. 幂次方

对任意正整数 N,计算 X^N mod 233333 的值。

输入格式
共一行,两个整数 X 和 N。

输出格式
共一行,一个整数,表示 X^N mod 233333 的值。

数据范围
1≤X,N≤10^9
输入样例:
2 5
输出样例:
32

本题复习快速幂算法。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

LL binaryPower(LL a,LL b,int t){
    if (b == 0) return 1;
    
    else if (b%2 == 1) return (a*binaryPower(a,b-1,t))%t;
    else{
        LL mul = binaryPower(a,b>>1,t);
        return (mul*mul)%t;
    }
}

int main(){
    
    LL x,n;
    cin >> x >> n;
    cout << binaryPower(x,n,233333) << '\n';
    return 0;
}

T4--3587. 连通图

给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。

输入格式
输入包含若干组数据。
每组数据第一行包含两个整数 n 和 m,表示无向图的点和边数。
接下来 m 行,每行包含两个整数 x,y,表示点 x 和点 y 相连。
点的编号从 1 到 n。
图中可能存在重边和自环。

输出格式
每组数据输出一行,一个结果,如果所有顶点都是连通的,输出 YES,否则输出 NO。

数据范围
输入最多包含 10 组数据。
1≤n≤1000,
1≤m≤5000,
1≤x,y≤n
输入样例:
4 3
1 2
2 3
3 2
3 2
1 2
2 3
输出样例:
NO
YES

可用DFS,BFS或者并查集。算并查集的模板题了。

#include <bits/stdc++.h>
using namespace std;
const int N = 1005,M = 10005; // 边是2倍的
int n,m,res;
int h[N],e[M],ne[M],idx;
bool st[N];

void add(int a,int b){
    e[idx] = b,ne[idx] = h[a],h[a] = idx ++;
}

void dfs(int x){
    st[x] = true;
    res ++;

    for (int i = h[x]; ~i;i = ne[i]){
        if (!st[e[i]]) dfs(e[i]);
    }
}

int main(){
    while (cin >> n >> m){
        memset(h,-1,sizeof h);
        memset(st,0,sizeof st);
        idx = res = 0; // 一些参数都要重置
        int x,y;
        for (int i = 0;i < m;i ++){
            cin >> x >> y;
            add(x,y),add(y,x);
        }

        dfs(1);
        if (res == n) cout << "YES\n";
        else cout << "NO\n";
    }
    return 0;
}

T5--3381. 手机键盘

参考原题。

参考题解:https://www.acwing.com/solution/content/102126/。

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
#define x first
#define y second
string s[] = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

int main(){
    unordered_map<char,PII> t;
    for (int i = 0;i < 8;i ++){
        for (int j = 0;j < s[i].size();j ++){
            t[s[i][j]] = {i,j+1};
        }
    }
    
    string str;
    while (cin >> str){
        int res = t[str[0]].y;
        for (int i = 1;i < str.size();i ++){
            if (t[str[i]].x == t[str[i-1]].x){
                res += 2;
            }
            res += t[str[i]].y;
        }
        cout << res << '\n';
    }
    return 0;
}

T6--3598. 二叉树遍历

假定一棵二叉树的每个结点都用一个大写字母描述。
给定这棵二叉树的前序遍历和中序遍历,求其后序遍历。

输入格式
输入包含多组测试数据。
每组数据占两行,每行包含一个大写字母构成的字符串,第一行表示二叉树的前序遍历,第二行表示二叉树的中序遍历。

输出格式
每组数据输出一行,一个字符串,表示二叉树的后序遍历。

数据范围
输入字符串的长度均不超过 26。

输入样例:
ABC
BAC
FDXEAG
XDEFAG
输出样例:
BCA
XEDGAF
#include <bits/stdc++.h>
using namespace std;
string str1,str2;
int pos[27];

struct Node{
    char val;
    Node *left,*right;
    
    Node(char _val):val(_val),left(NULL),right(NULL){}
};

Node* build(int a,int b,int l,int r){
    if (a > b) return NULL;
    auto root = new Node(str1[a]);
    int k = pos[str1[a]];
    root->left = build(a+1,k-l+a,l,k-1);
    root->right = build(k-l+a+1,b,k+1,r);
    return root;
}

void dfs(Node* x){
    if (x == NULL) return;
    dfs(x->left),dfs(x->right);
    cout << x->val;  
}

int main(){
    while (cin >> str1 >> str2){
        int n = str1.size();
        for (int i = 0;i < n;i ++) pos[str2[i]] = i;
        
        Node *root = build(0,n-1,0,n-1);
        dfs(root);
        cout << '\n';
    }
    return 0;
}
posted @   grant_drew  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示