大家仔细看注释,很详细,这次的暴力做法主要方法是模拟题干的过程,核心问题是:
1.如何选出最小值
2.如何找出与最小值两边相邻的数字
3.如何删除
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f3f
using namespace std;
const int N=5e5+10;
int a[N];// 记录数字下标
bool st[N]; //标记数字又没有被删除,true被删除
void solve(){
int n,k;cin>>n>>k;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<k;i++){
int minv=INF; //初始化最小值为正无穷
int pos=-1; //初始化初始位置
for(int j=0;j<n;j++){
if(minv>a[j]&&!st[j]){ //如果当前最小值大于当前数字的值,并且该数字没有被删除
minv=a[j];//让minv改为当前这个比较小的数
pos=j; //位置标记为当前数字的下标
}
}
st[pos]=true;//标记这个小的数为已删除
for(int j=pos-1;j>=0;j--){//遍历左边
if(!st[j]){
a[j]+=minv;
break;
}
}
for(int j=pos+1;j>=0;j++){//遍历右边
if(!st[j]){
a[j]+=minv;
break;
}
}
for(int i=0;i<n;i++){//遍历数组
if(!st[i]){//如果这个位置没有被删掉,则输出这个下标对应数字
cout<<a[i]<<" ";
}
}
cout<<endl;
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int t=1;
while(t--)
solve();
}