那位大佬可以帮忙看一下我的呆?,80分求调
查看原帖
那位大佬可以帮忙看一下我的呆?,80分求调
930714
zbr121115楼主2024/10/14 21:12

![21~25测试点答案错误]("C:\Users\lenovo\Pictures\Screenshots\屏幕截图 2024-10-14 210540.png")

我的思路很简单,就是先计算龙虎两边的势力和,然后枚举每一个位置打擂台记录最小差值(本蒟蒻太菜,大佬勿喷_orz_)

//注释起来的是用来调试的
#include<bits/stdc++.h>
using namespace std;
struct node{
	int p,s;
}a[100010];
struct h{
	int pos,t;
}ans;
int n,m,s1,s2,p1,p2,sl=0,sr=0,c;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//freopen("p5016_21.in","r",stdin);
	//freopen("p5016_21.out","w",stdout);
	cin>>n;
	for (int i=1; i<=n; i++){
		cin>>a[i].p;
	}
	cin>>m>>p1>>s1>>s2;
	a[p1].p+=s1;
	//cout<<endl<<"tmp:"<<endl; 
	int tmp1=0,tmp2=0;
	for (int i=1; i<=n; i++){
		if (i!=m){
			a[i].s=a[i].p*abs(m-i);
			//cout<<a[i].p<<"*"<<abs(m-i)<<"="<<a[i].s;
			if (i<m){
				sl+=a[i].s;
				//cout<<"[l s:"<<sl<<" m:"<<m<<" pos:"<<i<<"]"<<endl; 
			}
			if (i>m){
				sr+=a[i].s;
				//cout<<"[r s:"<<sr<<" m:"<<m<<" pos:"<<i<<"]"<<endl; 
			}
		}
	}
	//cout<<endl<<sl<<" "<<sr<<endl;
	if (sl==sr){
		cout<<m;
		return 0;
	}
	c=abs(sr-sl);
	ans.t=INT_MAX;
	for (int i=1; i<=n; i++){
		int tmp;
		if (i<m){
			tmp=sl;
			tmp+=s2*abs(m-i);
			//cout<<"[l "<<"pos:"<<i<<" (sl,sr):"<<abs(sr-tmp)<<"]"<<endl;
			if (abs(sr-tmp)<ans.t){
				ans.t=abs(sr-tmp);
				ans.pos=i;
			}
		}
		if (i>m){
			tmp=sr;
			tmp+=s2*abs(m-i);
			//cout<<"[r "<<"pos:"<<i<<" (sl,sr):"<<abs(sl-tmp)<<"]"<<endl;
			if (abs(sl-tmp)<ans.t){
				ans.t=abs(sl-tmp);
				ans.pos=i;
			}
		}
	}
	if (ans.t>c){
		cout<<m;
		return 0;
	}
	//cout<<endl<<sl<<" "<<sr<<endl<<ans.t<<" "<<ans.pos;
	cout<<ans.pos;
	return 0;
}

2024/10/14 21:12
加载中...