20250822 组题总结

A - a

在一个8×8的点阵网格中,某个小写拉丁字母组成的单词被完整地垂直书写在单一列内,从上到下连续排列(无间断)。

由题目可得,字母都在同一列,并且不会间断,所以不用什么复杂的判断,遇到字母直接加进字符串就行了。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        string s="";
        for(int i=1;i<=64;i++){//八八六十四
            char x;
            cin>>x;
            if(x!='.'){//如果不是字符
                s+=x;
            }
        }
        cout<<s<<endl;
    }
    return 0;
} 

B - b

一天,弗拉德突然好奇自己在地铁扶梯上能和哪些人交谈。扶梯上有n名乘客,共有m级台阶,编号从1到m,第i级台阶的高度为i*k厘米。

弗拉德的身高是H厘米。当两个人站在不同台阶上时,若他们的身高差等于所在台阶的高度差,就能进行对话。例如,身高170厘米和180厘米的两个人,当m=10,k=5时,可以分别站在第5和第7级台阶上(高度差为10厘米,等于身高差)。

现在给定包含n个身高的数组h,其中hi表示第i个人的身高。弗拉德想知道自己能和其中多少人分别进行对话。

这题暴力就能过,直接看每个人和弗拉德的身高差是否符合要求。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[55];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,m,k,h,ans=0;
        cin>>n>>m>>k>>h;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(abs(h-a[i])%k==0&&abs(h-a[i])/k+1<=m&&a[i]!=h){
                ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

C - c

给定一个长度为 n 的整数数组 a。你可以对该数组执行以下操作:

交换任意两个元素 ai 和 aj,需满足 i≠j 且 ai 与 aj 的奇偶性相同(同为奇数或同为偶数)。

问题要求判断:通过执行任意次数(包括零次)的上述操作,能否将数组按非递减顺序排序。

因为只有奇偶性 相同的两个数才能交换,所以如果一个数排完序后的预期位置的值与这个数的奇偶性不相同,最终答案就是不能。

我们只要看一下每个数排完序后的预期位置的值与这个数的奇偶性是否相同就能够得出答案。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[200005],b[200005];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            b[i]=a[i];//用于存储排完序后的预期位置
        }
        sort(b+1,b+1+n);
        bool cc=0;
        for(int i=1;i<=n;i++){
            if(a[i]%2!=b[i]%2){//奇偶性相同吗
                cc=1;
                break;
            }
        }
        if(!cc){
            cout<<"YES"<<endl;
        }else{
        	cout<<"NO"<<endl;
        }
    }
    return 0;
}

D - d

Bmail公司最初仅配备了一台路由器。随着业务发展,公司逐步新增了多台路由器。每当引入新路由器时,都会将其连接到现有的某台设备上。题目给出数组 pip_ipi(其中pip_ipi < i),表示第i台路由器连接的目标路由器编号。

现公司共拥有n台路由器。请输出从第1台到第n台路由器的完整路径序列。

这题考验你对树的理解,因为每个节点的父亲是唯一的,所以只要从n下标开始while,每次找到父亲,直到1号点。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[200005],n;
stack<int> s;
int main(){
    cin>>n;
    for(int i=2;i<=n;i++){//i从2开始的
        cin>>a[i];//a[i]代表i节点的父亲是a[i]
    }
    int x=n;//从n开始找父亲
    while(x!=1){
        s.push(x);//注意,不能直接输出,要用栈存着,我们是从1号节点出发的
        x=a[x];
    }
    s.push(1);//别漏了一号点
    while(!s.empty()){
        cout<<s.top()<<" ";//每次输出栈顶
        s.pop();
    }
    return 0;
}

E - e

波利卡普在圣诞树下发现了一个包含n个元素的数组a,以及游戏规则:

  1. 首先选择任意下标i(1 ≤ i ≤ n)作为起点
  2. 将棋子放在位置i(对应数值ai)
  3. 当i ≤ n时:
    • 将ai计入得分
    • 向右移动ai个位置(即i = i + ai)
  4. 当i > n时游戏结束

请帮助波利卡普计算,当选择最优起始下标时能获得的最大得分。

很显然是动态规划,但是要怎么设计呢?由于有多组数据,所以我们要时间复杂度尽量小的的方案。

我们设dpi表示走到i下标最多能得到dpi得分,那么我们可以枚举每一个点,看他能走到哪去,并更新那个点。

进行状态转移时我们暂时不加上该点的得分,最后找最大值时再加上。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[200005],dp[200005];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        memset(dp,0,sizeof dp);
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++){
            if(i+a[i]<=n){//如果没有越界
                dp[i+a[i]]=max(dp[i+a[i]],dp[i]+a[i]);
                //目前累计积分加上这一格的得分
            }
        }
        int mx=0;
        for(int i=1;i<=n;i++){
            mx=max(mx,dp[i]+a[i]);//加上该格的得分
        }
        printf("%d\n",mx);
    }
    return 0;
}
相关推荐
choumin27 分钟前
C++中std::move和std::forward的关系和区别
c++·std move·std forward·关系和区别
木井巳28 分钟前
【动态规划: 路径问题】不同路径
java·算法·leetcode·动态规划
程序猿编码32 分钟前
YOLOv5/v7/YOLOX 全支持:基于 TensorRT 的工业视觉推理底座详解
c++·yolo·机器学习·推理·模型推理
CQU_JIAKE39 分钟前
10.25【A】
数据结构·算法
kyle~40 分钟前
C++ 原子操作、内存模型与无锁并发编程
linux·开发语言·c++·操作系统
another heaven44 分钟前
【C/C++ C++ 面向对象架构的五大特点与能力场景:封装、继承、多态、抽象与 RAII(含实战案例)】
c语言·c++·架构
greencherry_1 小时前
大连模屿石膏课模具配比全固定,调色浇注之外还缺什么?
算法·生活
努力努力再努力wz1 小时前
【C++ 高阶系列】C++ 高性能网络编程:当 Reactor 遇见协程:从 epoll 回调到异步 MySQL,彻底打通任务挂起与恢复
网络·c++·mysql
晒太羊的猫2 小时前
hot100子串
java·算法·leetcode
霍霍的袁2 小时前
【C++11】左值右值引用与移动语义详细笔记(左值右值、右值引用、移动构造、移动赋值、引用折叠、万能转发)
c++·笔记·学习·visual studio