1 条题解
-
0
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
- 上传者