目录
数组操作 (acwing周赛)
给定一个长度为 n 的正整数数组 a1,a2,…,an。
请你对该数组进行 k 次操作,每次操作具体如下:
- 如果数组中存在非零元素,则找到其中的最小非零元素 x,将其输出,并让数组中的所有非零元素都减去 x。
- 如果数组中不存在非零元素,则输出 0 即可。
输入格式
第一行包含两个整数 n,k。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
共 k 行,其中第 i 行输出第 i 次操作需要输出的值。
数据范围
前四个测试点满足 1≤n≤10。
所有测试点满足 1≤n,k≤10e5,1≤ai≤10e9。
输入样例1:
3 5
1 2 3
输出样例1:
1
1
1
0
0
输入样例2:
4 2
10 3 5 3
输出样例2:
3
2
代码
需要代码解析请评论区扣1
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int a[N],s[N];
void insert(int l,int r,int c){
s[l]+=c;
s[r+1]-=c;
}
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a,a+n+1);
for(int i=1;i<=n;i++){
insert(i,i,a[i]);
}
int j=1;
for(int i=0;i<k;i++){
ll sum=0;
while(sum<=0&&j<=n) sum+=s[j++];
j--;
if(sum!=0){
insert(j,n,-sum);
printf("%d\n",sum);
}else{
printf("%d\n",sum);
}
}
return 0;
}
货仓选址(牛客网)
题目描述
在一条数轴上有N家商店,它们的坐标分别为 A[1]~A[N]。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
输入描述:
第一行一个整数N,第二行N个整数A[1]~A[N]。
输出描述:
一个整数,表示距离之和的最小值。
示例1
输入
4 6 2 9 1
输出
12
数据范围:
对于100%的数据:N≤1e5,A[i]≤1e6
代码
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int a[N];
int main(){
int n;
long long int sum=0;
cin>>n;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
for(int i=0;i<n;i++){
sum+=abs(a[n/2]-a[i]);
}
cout<<sum<<endl;
return 0;
}
证明: