第一条c++题解(超详解)
2026-07-26 22:02:13
发布于:陕西
2阅读
0回复
0点赞
思路
分析问题
核心问题
维护一个动态序列,支持三种操作:
查询:问第i个元素的值
插入:在第i个元素前插入一个新元素
删除:删除第i个元素
数据结构选择
n和m最大只有1000,数据规模很小,直接用数组模拟即可,不需要链表或vector。
具体做法
1. 查询(操作1)
直接输出 a[i],O(1)
2. 插入(操作2)
要在第i个位置前面插入v:
先把从i到末尾的元素全部往后移一位
然后在空出来的位置放入v
序列长度+1
在2前面插入7:
第1步:后移 → [6, 31, 31, 23, 14, 5]
第2步:赋值 → [6, 7, 31, 23, 14, 5]
3. 删除(操作3)
要删除第i个元素:
把从i+1到末尾的元素全部往前移一位
序列长度-1
原序列:[6, 31, 23, 14, 5]
删除第3个(23):
前移 → [6, 31, 14, 5]
为什么用数组就够了?
n≤1000,m≤1000
即使每次都插入,序列最长也就2000左右
数组移位的时间复杂度O(n),完全能接受
代码简单,不容易出错
复杂度
查询:O(1)
插入:O(n)
删除:O(n)
总体:O(n×m) ≈ 10⁶,完全可行
代码如下
#include <bits/stdc++.h>
using namespace std;
int a[2005];
int main(){
int n,m;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>m;
while(m--){
int o;
cin>>o;
if(o==1){
int i;
cin>>i;
cout<<a[i]<<endl;
}else if(o==2){
int i,v;
cin>>i>>v;
for(int j=n;j>=i;j--)a[j+1]=a[j];
a[i]=v;
n++;
}else if(o==3){
int i;
cin>>i;
for(int j=i;j<n;j++)a[j]=a[j+1];
n--;
}
}
return 0;
}
如果觉得好,请给一个赞,谢谢
这里空空如也




有帮助,赞一个