CF1417B Two Arrays

Solution

因为要求 (f) 最小,我们发现只要将 (a_i)(T-a_i) 染成不同的颜色就行了。

但是当 (T) 为偶数的时候, (frac T2) 是要一个染白,一个染黑这样轮流的。

举个例子:设 (k)(frac T2) 的个数,那么如果将 (k) 个全染一个颜色,则 (f) 起码是 (frac{(k-1)k}{2}) ,然后平均分成两种颜色,则是 ((frac k2-1)frac k2) ,是小于前值的。

注意:因为 (1leq a_ileq 10^9) ,所以可以拿 (map) 来做映射。

​ (要么开全局记得清零,要么开局部变量,不要像我一样没有清零然后考场爆零)

代码

#include<bits/stdc++.h>

using namespace std;
const int N=1e5+10;
int n,t,col[N],a[N],pre;
map<int,int> mp;

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        pre=0;
        mp.clear();
        scanf("%d%d",&n,&t);
        if(t%2){
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                if(mp[a[i]]) col[i]=1;
                else{
                    col[i]=0;
                    if(a[i]<=t) mp[t-a[i]]=1;//可以不判的,比赛的时候忘了qwq
                }
            }
            for(int i=1;i<=n;i++)
                printf("%d ",col[i]);
            puts("");
        }
        else{
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                if(a[i]==t/2){
                    if(pre) col[i]=1^col[pre];
                    pre=i;
                    continue;
                }
                if(mp[a[i]]) col[i]=1;
                else{
                    col[i]=0;
                    if(a[i]<=t) mp[t-a[i]]=1;
                }
            }
            for(int i=1;i<=n;i++)
                printf("%d ",col[i]);
            puts("");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jasony/p/13743089.html