社区讨论

为什么测试点11期待的结果带负号?

P2234[HNOI2002] 营业额统计参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mklyqhou
此快照首次捕获于
2026/01/20 10:16
4 周前
此快照最后确认于
2026/01/23 20:45
4 周前
查看原帖
根据题意描述,每天的最小波动等于和前面某天最小差距,就是在众多绝对值里面取最小值,可是为什么测试点11的期待结果第一个符号是符号?前面10个测试点都过了,就差第11个测试点,期待并感谢各位大佬指教! 待纠错代码如下:
CPP
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=32768;
ll n,a[N],ans;//利用插入排序的思想计算最终位置左右哪边差值小
int main(){
	ios::sync_with_stdio(0);//取消输入输出流同步
	cin.tie(NULL);//解除cin和cout绑定
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];//输入
		if(a[i]>=a[i-1]){//直接接到末尾即可
			ans+=abs(a[i]-a[i-1]);//更新答案
			continue;
		}
		//否则,接入开头到中间某个位置
		int pos=-1;//记录a[i]的最终位置
		for(int j=i;j>=2;j--){//往左插入到合适位置
			if(a[j-1]>a[j]){
				swap(a[j-1],a[j]);//交换
				pos=j-1;//更新位置
			}
			else break;
		}
		ll dk=abs(a[pos]-a[pos+1]);//初始化
		if(pos-1>=1) dk=min(dk,abs(a[pos-1]-a[pos]));//避免越界
		ans+=dk;//更新答案
	}
	//输出检验
	//for(int i=1;i<=n;i++) cout<<a[i]<<' '; cout<<'\n';
	cout<<ans;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...