Codeforces 301A. Yaroslav

Codeforces Tutorial

A. Yaroslav and Sequence

Problem Analysis

1、当n为奇数的时候,变换n个可以一次增加或减少1个负数,这样可以直到有n个负数,然后全变为整数ok
2、当n为偶数的时候,变换n个可以一次增加或减少2个负数,所以当有偶数个负数时都可以变为正数,当有奇数个负数时,最大和为(绝对值最小的那个为负数,其余的都为正数)。

用例子解释一下上面的内容。

  • n为奇数
    不妨设n=5,有序列-1,-1,-1,-1,-1,-1,-1,-1,-1。可以发现,始终可以做到使得负数的个数小于n/2。序列变为1,1,1,1,1,-1,-1,-1,-1。然后选取n/2+1个正数,n/2个负数,就可以增加一个负数。上例就是是选择312-1。序列变为1,1,1,1,-1,-1,-1,-1,-1。然后一步变为全正。
  • n为偶数
    思路与奇数一样,不同的是对n的划分,n只能划分为n/2-1n/2+1

Acepted Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<map>
#include<istream>
#include<cassert>
#include<set>
#define DEBUG(x) cout<<#x<<" = "<<x<<endl
#define DEBUG2(x,y) cout<<#x<<" = "<<x<<" , "\
<<#y<<" = "<<y<<endl
using namespace std;
typedef long long ll;
const int MAXN=300;
int n;
int a[MAXN];
int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d",&n);
    for(int ii=0;ii<2*n-1 ;ii++ ){
        scanf("%d",&a[ii]);
    }
    int ans=0;
    if(n%2){
        for(int ii=0;ii<2*n-1 ;ii++ ){
            ans+=abs(a[ii]);
        }
    }
    else {
        int cnt=0;
        int absmin=1e9;
        for(int ii=0;ii<2*n-1 ;ii++ ){
            if(a[ii]<0)cnt++;
            absmin=min(absmin,abs(a[ii]));
            ans+=abs(a[ii]);
        }
        if(cnt%2)ans-=2*absmin;
    }
    printf("%d\n",ans);
}

Wrong Answer Cases

What I Learn

  • 奇偶性遇到的比较多

Reference

https://blog.csdn.net/xh_reventon/article/details/8892546

posted @ 2019-05-29 18:37  MalcolmMeng  阅读(190)  评论(0编辑  收藏  举报