题解 CF1237A
题解 CF1237A
King~
-
思路?!
这里提供一个新的思路。
因为数据保证肯定可以让所有的数字加起来为零,所以我们可以考虑让所有奇数都变为 \(\lfloor a_i/2 \rfloor\)
这样,如果和 \((sum)\) 是小于零的话,我们可以操作一部分奇数数字变为 \(\lceil a_i/2 \rceil\),这样最终的和就会加一
思考一下就可以发现,我们只需要更改 \((-sum)\) 个奇数即可
-
代码具体细节
用 \(vis\) 数组记录是否为奇数,然后将原数组的值变为本身的 \(1/2\) 同时向下取整
这里判断方法通过记录向上取整和向下取整是否相同计算
最终只需要从所有的奇数中取到 \(-sum\) 个即可
/*
#date :10/28/2022
#editor :apple_tyr/Apollo_tyr
#problem or
contest:CF1237A
*/
#include<map>
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int n,sum;
int a[13945];
bool vis[13945];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
int t=x/2;
if(t*2!=x){
vis[i]=1;
if(x<0){
t--;
}
}
a[i]=t;
sum+=t;
}
if(sum!=0){
sum=-sum;
for(int i=1;i<=n;i++){
if(vis[i] && sum){
sum--;
printf("%d\n",a[i]+1);
}else{
printf("%d\n",a[i]);
}
}
}else{
for(int i=1;i<=n;i++)
printf("%d\n",a[i]);
}
return 0;
}