当前位置: 首页 > news >正文

2025-暑期训练二

核心:使用set存储所有相邻字符对,自动去重。

B

错误原解:只想简单的开一个,额外的c数组用来 找原来的索引,但往下做可以发现行不通

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
long long a[N],b[N],c[N];
void solve(){bool mark[N]={0}; //保证每次调用函数mark数组都重置为0int n,k;cin>>n>>k;for(int i=0;i<n;i++){cin>>a[i];c[i]=a[i];}for(int i=0;i<n;i++){cin>>b[i];}sort(a,a+n);sort(b,b+n);for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(c[i]==a[j]&&!mark[j]&&i!=(n-1)){    //如果数组中存在相同元素,那么此时会直接把所有符合c[i]==a[j]cout<<b[j]<<" ";                   //条件所对应的b[j]一次性全部打印出来,造成第二样例出现多余的数mark[j]=1;}if(c[i]==a[j]&&!mark[j]&&i==(n-1)) cout<<b[j]<<endl;}}
}
int main(){int t;cin>>t;while(t--)solve();return 0;
}

正解:利用pair存储预测温度及其原始索引

核心逻辑分析

1. 数据结构设计

  • vector<pair<int, int>> a:存储预测温度及其原始索引,用于在排序后仍能追踪每个温度的原始位置。
  • vector<int> b:存储实际温度,后续需要排序。
  • vector<int> ans:存储最终结果,按原始索引顺序排列。

2. 排序策略

  • b排序:将实际温度按升序排列。
  • a排序:按预测温度值升序排列,同时保留原始索引。

3. 匹配逻辑

  • 由于题目保证存在解,排序后的ab可以按顺序一一匹配。即排序后的第i个预测温度对应排序后的第i个实际温度。
  • 通过a[i].second获取预测温度的原始索引,将对应的实际温度b[i]放入结果数组ans的正确位置。

陌生知识点

1.

for (auto& i : b) {cin >> i;
}
  • auto& i:声明一个引用变量 i,类型由编译器自动推导(auto)。使用引用(&)允许直接修改容器中的元素。
  • b:要遍历的容器(如 vectorarraystring 等)。
  • 循环体:对容器中的每个元素执行的操作。

上述代码等价于:

for (int i = 0; i < b.size(); i++) {cin >> b[i];
}
2.pair<int, int> a(n) 的含义
  • 创建单个 pair:这行代码创建了一个名为 a 的 pair 对象,而非数组。
  • 初始化参数n 被用作 pair 的第一个元素first)的初始值,第二个元素(second)默认初始化为 0

等价于:pair<int, int> a = {n, 0}; // 第一个元素为n,第二个元素为0

vector<pair<int, int>> a(n); 是 C++ 中声明并初始化一个动态数组的语句,创建了一个名为 a 的 vector 容器,它可以存储 n 个 pair 对象

语法分解

  • vector:C++ 标准库中的动态数组容器,可自动调整大小。
  • pair<int, int>:存储两个 int 类型元素的组合,称为 “键值对”。
  • a(n):创建名为 a 的向量,初始大小为 n,每个元素都是 pair<int, int> 类型,默认初始化为 {0, 0}
  • 排序时,默认会按照 pair 的第一个元素(first)升序排列

总结

  • pair<int, int> a(n):创建 单个 pair,用于存储 一组键值对
  • vector<pair<int, int>> a(n):创建 动态数组,用于存储 多组键值对

代码:

#include<bits/stdc++.h>
using namespace std;
void solve(){int n,k;cin>>n>>k;vector<int>b(n),result(n);vector<pair<int,int>>a(n);for(int i=0;i<n;i++){cin>>a[i].first;a[i].second=i;}for(auto &i:b)cin>>i;sort(b.begin(),b.end());sort(a.begin(),a.end());for(int i=0;i<n;i++){result[a[i].second]=b[i];// 将b[i]放入result中对应a[i]的原始位置}for(int i=0;i<n;i++){cout<<result[i]<<" ";}cout<<endl;
}
int main(){int t;cin>>t;while(t--){solve();}return 0;
}

C

错误原解:求最小值时,必须初始胡为足够大的值,比如1e18;

#include<bits/stdc++.h>
using namespace std;
const int N=200005;
int a[N];
void solve(){int n;cin>>n;long long mn=200005;  //mn 初始化为 200005,若输入的所有元素都大于这个值,for(int i=0;i<n;i++){  //mn 不会被正确更新。应初始化为足够大的值(如 1e18)或第一个元素。cin>>a[i];if(a[i]<mn) mn=a[i];} bool o=1,q=1;for(int i=0;i<n;i++){if(a[i]%2==0)q=0;if(a[i]%2==1)o=0;}if(o||q){cout<<"YES"<<endl;return;}if(mn%2==0){for(int i=0;i<n;i++){if(a[i]%2==1){cout<<"NO"<<endl;return;}}}cout<<"YES"<<endl;
}
int main(){int t;cin>>t;while(t--) solve();return 0;
}

正解:

#include<bits/stdc++.h>
using namespace std;
const int N=200005;
int a[N];
void solve(){int n;cin>>n;long long mn=1e18;  //改数即可for(int i=0;i<n;i++){cin>>a[i];if(a[i]<mn) mn=a[i];} bool o=1,q=1;for(int i=0;i<n;i++){if(a[i]%2==0)q=0;if(a[i]%2==1)o=0;}if(o||q){cout<<"YES"<<endl;return;}if(mn%2==0){for(int i=0;i<n;i++){if(a[i]%2==1){cout<<"NO"<<endl;return;}}}cout<<"YES"<<endl;
}
int main(){int t;cin>>t;while(t--) solve();return 0;
}

核心思路:

  • 若最小元素为奇数,则所有元素都要调整为奇数且奇数-奇数,偶数-奇数都等于奇数,因此,只要最小元素是奇数,就输出YES。
  • 若最小元素为偶数,则所有元素都要调整为偶数,只有偶数-偶数=偶数,因此一旦出现奇数就输出NO。

因此这样写代码更简洁,因为已经包含了全奇全偶的情况了

简洁代码:

#include<bits/stdc++.h> 
using namespace std;     void solve() {           int n;               cin >> n;   vector<int> a(n);    for (int i = 0; i < n; i++)cin >> a[i];     sort(a.begin(), a.end());  // 对数组a进行升序排序if (a[0] % 2 == 1) {       // 检查最小元素是否为奇数cout << "YES" << endl; return;                // 结束当前测试用例的处理}for(int num : a) {        // 遍历排序后的数组aif (num % 2 == 1) {    // 检查是否存在奇数元素cout << "NO" << endl; return;            // 结束当前测试用例的处理}}cout<<"YES"<<endl;     // 若所有元素都是偶数,输出YES
}int main() {                  int t;                cin >> t;                 while(t--) solve();return 0;                 
}
http://www.dtcms.com/a/265159.html

相关文章:

  • 通过具有一致性嵌入的大语言模型实现端到端乳腺癌放射治疗计划制定|文献速递-最新论文分享
  • AlpineLinux安装部署zabbix
  • 进程概念以及相关函数
  • 进程(起个开头,复习的一天)day26
  • 轻松上手:使用Nginx实现高效负载均衡
  • 应用密码学纲要
  • 怎样理解:source ~/.bash_profile
  • 决策树(Decision tree)算法详解(ID3、C4.5、CART)
  • 在线学堂-3.媒资管理模块(二)
  • 软件反调试(2)- 基于窗口列表的检测
  • 外侧三兵策略
  • 睿抗省赛2023
  • 【通识】机器学习相关
  • YOLOv11剪枝与量化(二)通道剪枝技术原理
  • 【Ragflow】30.离线环境迁移方案
  • 数据库9:数据库字符编码调整与校队(排序)规则
  • STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader
  • UI 设计|审美积累 | 拟物化风格(Skeuomorphism)
  • 基于Jeecgboot3.8.1的vue3版本前后端分离的flowable流程管理平台
  • ai之RAG本地知识库--基于OCR和文本解析器的新一代RAG引擎:RAGFlow 认识和源码剖析
  • 学习笔记(29):训练集与测试集划分详解:train_test_split 函数深度解析
  • SimBa:实现深度强化学习参数scaling up
  • 多路I/O转接服务器(select、poll、epoll)
  • 跨境贸易的主要挑战是什么?
  • monorepo + Turborepo --- 构建仓库结构
  • 如何设置电脑定时休眠?操作指南详解
  • 从 PostgreSQL 到 DolphinDB:数据实时同步一站式解决方案
  • 金融安全生命线:用AWS EventBridge和CloudTrail构建主动式入侵检测系统
  • 少样本学习在计算机视觉中的应用:原理、挑战与最新突破
  • Java 导出PDF 1、内容可以插入自定义表格 2、内容插入图片