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; }