- 题目:合并数字
消除相邻的差的绝对值为1的两个数中较大的那一个。这一天,她得到了 m 个数字,她只能选出最左边的相邻的差的绝对值为 1 的两个数,保留较小的数,泯灭较大的数,直到没有两个相邻的差的绝对值为 1 的数,问小铭学姐最多可以进行多少次这样的操作?
输入格式
输入第一行为一个整数 n(1 <= n <= 10^5),表示数字的总数
第二行为 n 个整数,这些数字的范围为[0, 10^9]。
输出格式
输出一行,为一个整数,表示小铭学姐最多可以进行多少次这样的操作。
Sample Input
4
1 2 0 1
Sample Output
3
- 分析思路:
知识点:一维动态数组
1.法一:
vector <int> a; //定义动态数组
int main() {
for(int i = 1;i <= n;i ++)
a.push_back(i); //类似队列的数组元素插入
a.pop_back(); //删除末尾元素
cout << a.size() << endl; //输出数组大小
for(int i = 0;i < n-1;i ++)
cout << a[i] << endl; //输出所有元素
}
2.法二
int **a=(int**)malloc(m*sizeof(int*));
memset(a,0,m*sizeof(int*));
for(int i=0;i<n;i++)
{
a[i]=(int*)malloc(n*sizeof(int));
memset(a[i],0,n*sizeof(int));
}
//或者
int (*a)[8]=new int[8][8];
memset(a,0,8*8*sizeof(int));
3.C++万能头文件:几乎包含所有头文件
#include<bits/stdc++.h>
- 方法一:
开辟一个动态数组,顺序遍历
时间超时,不通过,后面改进
- 代码一:
#include<iostream>
#include<cmath>
#include <cstdio>
#include<cstdlib>
using namespace std;
int main()
{
int n=1000000,i;
scanf("%d",&n);
int *a=(int *)malloc(sizeof(int)*n);
scanf("%d",a);
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if((a[i]>a[j])&&abs(a[i]-a[j]==1)){
n--;
}
else if((a[i]<a[j])&&abs(a[i]-a[j]==1)){
n--;
}
}
}
cout<<n<<endl;
free(a);
return 0;
}
- 方法二:利用栈实现
- 代码二:
#include<iostream>
#include<cmath>
#include<stack>
//#include<bits/stdc++.h> //万能头文件,几乎包含所有头文件
using namespace std;
stack<int> s;
int main(){
int n,m,cnt=0;
cin>>n;
while(n--){
cin>>m;
while(!s.empty()&&s.top()-m==1){
s.pop();
cnt++;
}
if(!s.empty()&&m-s.top()==1)
cnt++;
else s.push(m);
}
cout<<cnt<<endl;
return 0;
}