zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    regedit注册表
    Environment应用
    VMI帮助类
    Image帮助类
    asp.net core+Postman
    printf和cout的区别详述
    C++指针
    Qt button和buttons区别
    visual studio收函数
    编译警告
  • 原文地址:https://www.cnblogs.com/liyexin/p/13756092.html
Copyright © 2011-2022 走看看