列表

详情


NC51548. 构造B数组

描述

给一个长度为n的数组a,现在要你构造一个长度为n的数组b,使得数组b的元素总和恰好为m且每个元素最小值不能小于0,且  最小,求出这个最小值

输入描述

第一行输入两个数n,m (1 <= n, m <= 1e5)

第二行输入n个数表示ai(1 <= ai <= 1e3)

输出描述

一个数,表示答案

示例1

输入:

3 1
1 2 3

输出:

21

示例2

输入:

3 5
1 1 2

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 89ms, 内存消耗: 3284K, 提交时间: 2019-07-29 18:39:34

#include<bits/stdc++.h>
using namespace std;
struct node{
	int aa,b;
	long long p;
	bool operator <(const node& tt)const {
		return p>tt.p;
	}
};
priority_queue<node>q;
long long gao(int x,int t)
{
	long long ans=1ll*x*(x-t)*(x-t);
	return ans;
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		long long h=gao(x,1)-gao(x,0);
		q.push(node{x,0,h});
	}
	for(int i=1;i<=m;i++)
	{
		node pp=q.top();
		q.pop();
		pp.b++;
		pp.p=gao(pp.aa,pp.b+1)-gao(pp.aa,pp.b);
		q.push(pp);
	}
	long long res=0;
	while(!q.empty())
	{
		node tp=q.top();
		q.pop();
		res+=gao(tp.aa,tp.b);
	}
	cout<<res<<'\n';
}

C++11(clang++ 3.9) 解法, 执行用时: 69ms, 内存消耗: 4708K, 提交时间: 2019-07-27 10:38:16

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
	ll a,s,c;
	int b;
	bool operator<(const node& x)const{
		return x.c>c;
	}
};
ll cal(ll x,ll y){
	return x*(x-y)*(x-y);
}
priority_queue<node>q;
int main(){
	int n,m;
	node t;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&t.a);
		t.b=0;
		t.s=cal(t.a,t.b);
		t.c=t.s-cal(t.a,t.b+1);
		q.push(t);
	}
	for(int i=1;i<=m;i++){
		t=q.top();
		q.pop();
		t.b++;
		t.s=cal(t.a,t.b);
		t.c=t.s-cal(t.a,t.b+1);
		q.push(t);
	}
	ll ans=0;
	while(!q.empty()){
		ans+=q.top().s;
		q.pop();
	}
	printf("%lld\n",ans);
}

上一题