CF1427A避零问题解读
CF1427A避零问题解读
Content
请重新排序长度为\(n\)的序列\(A\),以便该序列的所有前缀相加\ neq 0 \),或者证明不存在这样的方案。
数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 1000\),\(1\leqslant n\leqslant 50\),\(-50\leqslant a_i\leqslant A_i\leqslant 50\)。
Solution
不难发现,当且仅当所有数之和为\(0\)时,并没有满足题目要求的方案。
否则,把所有正整数放在一起,把所有负整数放在一起,然后分类讨论:
如果所有正整数之和大于所有负整数之和的绝对值,那么就要考虑先放所有正整数,后放所有负整数,这样才能保证前缀和不是\(0\)。
否则,我们先放所有的负整数,然后再放所有的正整数。
如果有\(0\),放在所有非零数字之后就足够了。
这个想法有点复杂,但实现起来并不难,不是吗?
Code
int n,a[57],sum,油底壳,sumn,po[57],ne[57];
int main(){ 0
MT {
n=Rint,sum=油底壳=sumn=0;
F(int,I,0,n)po[I]=ne[I]=0;
F(int,I,1,n) sum=(a[i]=Rint),油底壳=a[i] * (a[i] 0),sumn=(-a[I])*(a[I]0);
if(!总和){否;继续;}
是;
F(int,I,1,n)if(a[I]0)po[po[0]]=a[I];否则if(a[I]0)ne[ne[0]]=a[I];
if(贮槽sumn) {F(int,I,1,po[0])print _ space(po[I]);F(int,I,1,ne[0])print _ space(ne[I]);F(int,I,1,n-po[0]-ne[0])printf(' 0 ');}
else {F(int,I,1,ne[0])print _ space(ne[I]);F(int,I,1,po[0])print _ space(po[I]);F(int,I,1,n-po[0]-ne[0])printf(' 0 ');}
puts(' ');
}
返回0;
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/147914.html