8.15纪中比赛T1
又是一道T1的签到题,又是一道模拟送分题,又是一道看似简单其实难的题……
题目描述:
样例输入1
6
2 3 2 3 2 3
4 6 5 2
样例输入2
6
1 1 1 1 1 16
5 4 1 1
样例输出1
2
样例输出2
1
题目解法:其实我们不难看出,这是一道模拟题。模拟出双方的兵势值,然后直接暴力求出放在那里才能使双方差距最小。我们可以将“天降神兵”这一操作看做原来就在那个地方的。但是,千万要注意两点:1.数据范围要开long long 2.可以放在中间点,也就是m的位置。
#include<cstdio>
#include<cmath>
using namespace std;
long long n,p1,s1,s2,m;
long long a[10000005];
long long left,right,ans=999999999,jl;
int main()
{
freopen("fight.in","r",stdin);
freopen("fight.out","w",stdout);
left=right=0;
scanf("%lld",&n);
for(long long i=1;i<=n;++i)
scanf("%lld",&a[i]);
scanf("%lld%lld%lld%lld",&m,&p1,&s1,&s2);
for(long long i=1;i<=n;++i)
{
if(i<m) left+=(m-i)*a[i];
if(i>m) right+=(i-m)*a[i];
}
if(p1>m) right+=(p1-m)*s1;
if(p1<m) left+=(m-p1)*s1;
for(long long i=1;i<=n;++i)
{
if(i<m)
{
left+=(m-i)*s2;
if(abs(right-left)<ans)
ans=abs(right-left),jl=i;
left-=(m-i)*s2;
}
if(i>m)
{
right+=(i-m)*s2;
if(abs(right-left)<ans)
ans=abs(right-left),jl=i;
right-=(i-m)*s2;
}
if(i==m)
if(abs(right-left)<ans)
ans=abs(right-left),jl=i;
}
printf("%lld",jl);
return 0;
}
好啦,感谢大家的观看!!!