题解 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;
}
posted @ 2022-11-30 09:08  Tyrue  阅读(20)  评论(0编辑  收藏  举报