王之新学期 贪心法
My Solution
关键是对奇偶讨论,中间位置, 以及迭代停止的位置,和额外讨论的地方
贪心策略:从两边开始历遍,把多余的任务往里移。
然后,偶则特殊处理中间两位,奇则只注意中间位置的数组下标(中间一个不用遍历到)及停下的时候的状态。
且如果n%2==0,则sum必须为偶。先行判断这个,如果不符合则直接输出-1,只有这个时候是-1,然后下面对于n%2==0,就一定存在了。
#include
#include
#include
#include
//#define LOCAL
const int maxn=10000+5;
int hz[maxn];
using namespace std;
int main()
{
#ifdef LOCAL
freopen("a.txt","r",stdin);
#endif // LOCAL
int T,n,sum,cot,tem;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(hz,0,sizeof(hz));sum=0;cot=0;
for(int i=0;i<n;i++){
scanf("%d",&hz[i]);
sum+=hz[i];
}
if(n%2==0&&sum%2!=0) printf("-1");
else{
if(n%2==0){
for(int i=0;i<(n/2-1);i++){ //最后一步不能再这么移了,中间,看看是不是和为偶数
cot+=abs(hz[i]-hz[n-i-1]);//cout<<hz[i]<<" "; if(hz[i]>=hz[n-i-1]) hz[i+1]+=hz[i]-hz[n-i-1];
else hz[n-i-1-1]+=hz[n-i-1]-hz[i];
}
tem=hz[n/2-1]+hz[n/2];cout<<cot+abs(tem/2-hz[n/2]);//如n=4,0 1 2 3 用下面的会输出0,n=2,0 2也是输出0;
//printf("%d",cot+abs(tem/2-hz[n/2]));//<<cot+abs(tem/2-hz[n/2])不能用printf()输出,有类型的错误转化
//arning: format '%d' expects argument of type 'int',
//but argument 2 has type '__gnu_cxx::__enable_if<true, double>::__type {aka double}' [-Wformat=]
}
else{
for(int i=0;i<(n-1)/2;i++){ cot+=abs(hz[i]-hz[n-i-1]); if(hz[i]>=hz[n-i-1]) hz[i+1]+=hz[i]-hz[n-i-1];
else hz[n-i-1-1]+=hz[n-i-1]-hz[i];
}
printf("%d",cot);
}
}
if(T) printf("n");
}
return 0;
}
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
- THE END -
最后修改:2024年11月15日
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/uestc-1018/
共有 0 条评论