72分求助
查看原帖
72分求助
68574
HGJH°L楼主2020/8/11 21:04
#include<bits/stdc++.h>//万能头 
#define ll long long//简写 

using namespace std;

int n,m;
int a[100005];//每个点的工兵数量 
ll suma,sumb;//左侧的气势/右侧的气势 
int p;
ll q;
ll minn;//气势差的最小值 
int ans;//答案 
int i;//循环 

ll abss(ll x)
{
	return ((x>=0)?x:-x);
}

int main(int argc,char** argv)
{
	
	cin >>n;
	for (i=1;i<=n;i++)
		cin >>a[i];
	cin >>m;
	cin >>p>>q;
	a[p]+=q;
	for (i=1;i<m;i++)
		suma+=a[i]*(m-i);
	for (i=m+1;i<=n;i++)
		sumb+=a[i]*(i-m);
	ans=m;//初始化 
	minn=abss(suma-sumb);//计算差值 
	cin >>p;//重复利用 
	if (minn==0)//如果差值为0 
		cout <<m<<endl;
	else if (suma<sumb)//如果左侧气势小于右侧 
		for (i=1;i<m;i++)
		{
			q=p*(m-i);
			suma+=q;
			if (abss(suma-sumb)<minn||((abss(suma-sumb)==minn)&&(i<ans)))//如果气势差小于最小值或二者相等但兵营编号更小 
			{
				minn=abss(suma-sumb);//更新最小值 
				ans=i;//更新答案 
			}
			suma-=q;//回到原来的值 
		}
	else//如果右侧气势小于左侧 
		for (i=m+1;i<=n;i++)
		{
			q=p*(i-m);
			sumb+=q;
			if (abss(suma-sumb)<minn||((abss(suma-sumb)==minn)&&(i<ans)))//如果气势差小于最小值或二者相等但兵营编号更小
			{
				minn=abss(suma-sumb);//更新最小值 
				ans=i;//更新答案 
			}
			sumb-=q;//回到原来的值 
		}
	cout <<ans<<endl;//输出答案 
	return 0;
}

WA了1、4、21-25号测试点,神奇

2020/8/11 21:04
加载中...