Codeforces Round #673 (Div. 2)B. Two Arrays(贪心)

地址:http://codeforces.com/contest/1417/problem/B

题意:

将一个数组分成两组(各组个数可以不一样)c[],d[]

保证f(c)+f(d)最小

f()表示数组中bi+bj==T的对数

解析:

贪心

T为两两相加,那可以平均一下,就是T/2

对于<T/2的数,分一组,两两相加绝不会==T

对于>T/2的数,分一组

对于==T/2的数,分两种情况:

1:T是奇数,那么T/2是比实际的T/2的小的,那么如果放入>T/2的组,是有可能两两相加变成==T的,所以分到<T/2的那组

2:T是偶数,两方平分即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+50;
int a[maxn];
int vis[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
    //    memset(vis,3,sizeof(vis));
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++)
            {
            cin>>a[i];    
            vis[i]=3;
            }
            
        int cnt=0;int md=k/2;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>k/2)
                vis[i]=1;
            else if(a[i]<k/2)
                vis[i]=0;
            else
            {
                if(md*2==k)
                {
                    cnt++;
                    if(cnt&1)
                        vis[i]=0;
                    else
                        vis[i]=1;
                }else
                {
                    vis[i]=0;
                }
            }
            
        }
        for(int i=1;i<=n;i++)
            cout<<vis[i]<<" ";
            cout<<endl;


    }
    return 0;
}

 

posted @ 2020-09-30 19:33  liyexin  阅读(71)  评论(0编辑  收藏  举报