Codeforces Round #580 (Div. 2)

Codeforces Round #580 (Div. 2)

这次比上次多A了一道,但做得太慢,rating还是降了。

Problem A Choose Two Numbers

题意:给出两个集合A,B,从A,B中分别选出元素a,b使得a+b既不属于集合A,又不属于集合B

数据范围:1<=集合A,B的大小<=100 1<=a,b<=200

直接模拟就好了

#include <iostream>
#include <cstdio>
using namespace std;
int n,m;
int a[210],b[210];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    scanf("%d",&m);
    for(int j=1;j<=m;j++)scanf("%d",&b[j]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int x=a[i]+b[j];
            int pd1=0,pd2=0;
            for(int ii=1;ii<=n;ii++)
            {
                if(x==a[ii])
                {
                    pd1=1;break;
                }
            }
            if(pd1==1)continue;
            for(int jj=1;jj<=m;jj++)
            {
                if(x==b[jj])
                {
                    pd2=1;break;
                }
            }
            if(!pd1&&!pd2)
            {
                printf("%d %d\n",a[i],b[j]);return 0;
            }
        }
    }
    return 0;
}

Problem B Make Product Equal One

给出n个数a1,a2,...,an,你可以用一点花费使得a[i]加一或减一,求最小的花费使得a1 a2 a3 ... an=1。

数据范围:1<=n<=1e5 -1e9<=a[i]<=1e9

贪心,从1枚举到n,如果一个数为正,把它变为1,如果为负,变为0,同时记录负数的个数,如果为0,则花费加1,这个0因为可以变成1也可以变成-1,所以可以用来调节正负(只需要一个0就可以调节正负) 统计完以后,如果0的个数为0(即不能调节正负),且负数的个数为奇数,则答案+=2

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int main()
{
    int tot1=0;
    scanf("%d",&n);
    long long ans=0;
    int tot2=0;
    for(int i=1;i<=n;i++)
    {
        int x;scanf("%d",&x);
        if(x<0)
        {ans+=-1-x;tot1++;}
        else
        {
            if(x==0){tot2++;ans+=1;}
            else{ans+=x-1;}
        }
    }
    if(tot1%2==1&&tot2==0)ans+=2;
    cout<<ans;
    return 0;
}

Problem C Almost Equal

题意:给出一个数字n,由1,2,3,...,2*n按一定顺序组成一个圆环,使得圆环上的每n个连续数字得到一个和,且任意两个和的差小于等于1。

举例:

当n=3的情况:
mlxmTI.png

猜你喜欢

转载自www.cnblogs.com/LianQ/p/11376135.html