1 条题解

  • 0
    @ 2022-6-24 4:50:48

    C++ :

    #include<iostream>
    #include<cstdio>
    using namespace std;
    long long n,m,k,a[10000005];
    int main()
    {
    // 	freopen("fight.in","r",stdin);
    // 	freopen("fight.out","w",stdout);
        scanf("%lld",&n);
        for(int i=1;i<=n;++i)
            scanf("%lld",&a[i]);
        long long x,y;
        scanf("%lld%lld%lld%lld",&m,&x,&y,&k);
        if(m==1 || m==n)//因为都大于0,所以如果在1或n就可以直接输出m
        {
        	printf("%d",m);
        	fclose(stdin);
        	fclose(stdout);
        	return 0;
        }
        a[x]+=y;//把后来要加的加上
        long long l=0,r=0;
        for(int i=1;i<=n;++i)//算气势
        {
            if(i<m)l+=(long long)a[i]*(m-i);
            else r+=(long long)a[i]*(i-m);
        }
        if(l<r)//如果右边的气势比左边大,把“救兵”放左边
        {
            long long t=m-((r-l)/k);//这个程序的精华
            if((r-l)%k>k/2)t--;//精华#2,因为要算最近的,所以一波骚操作。还有考试的时候,就错这,t--写成t++了,对了就一等了.[哭][哭][哭]
            printf("%lld",max(t,(long long)1));//防止超界
        }
        else 
        if(l>r)//如果左边的气势比右边大,把“救兵”放右边
        {
            long long t=m+((l-r)/k);//精华
            if((l-r)%k>k/2)t++;//精华#2
            printf("%lld",min(t,(long long)n));//防止超界
        }
        else
        if(l==r)printf("%lld",m);//如有两边气势相同,就放在分界点
    // 	fclose(stdin);
    // 	fclose(stdout);
        return 0;
    }
    
    
    • 1

    信息

    ID
    141
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者