Codeforces 149C Division Into Teams 构造

来源:互联网 发布:vue.js生命周期面试题 编辑:程序博客网 时间:2024/04/18 18:03

点击打开链接

题意:n个人(n<=1e5),每个人价值为ai,要求分成2组,使得两组人数之差<=1 && 两组价值差小于<=max(ai) 

构造即可:按价值排序后 奇数号给x,偶数号给y(看成天平,每次倾斜向每次选人的那一边)每轮两边差为a[i]-d d>=0 所以两边差始终<=max(a[i])

或者把价值表示在x轴上 [1,2] [3,4] 为一段 则所以线段都落在[0,max(ai)]内,容易看出每段之差的累加和也在max(a[i])内.

#include <bits/stdc++.h>using namespace std;const int N=2e5+20;int n;pair<int,int> a[N];vector<int> x,y;int main(){while(cin>>n){int mx=0;for(int i=1;i<=n;i++){scanf("%d",&a[i].first);a[i].second=i;}sort(a+1,a+1+n);int x;if(n%2)x=n/2+1;elsex=n/2;cout<<x<<endl;for(int i=1;i<=n;i+=2)cout<<a[i].second<<' ';cout<<endl<<n-x<<endl;for(int i=2;i<=n;i+=2)cout<<a[i].second<<' ';cout<<endl;}return 0;}


0 0