思路:把两种颜色先按值sort一下,最小值肯定是叶子,然后把这个叶子和另外一中颜色的一个最小值的节点连接起来,再把这个节点变成叶子,把值减掉就可以了。
如下图:
代码1:
#includeusing namespace std;const int N=1e5+5;struct node{ int val,id; bool operator <(node &a) { return val >n; for(int i=1;i<=n;i++) { cin>>col>>val; if(col) { b[c2].id=i; b[c2++].val=val; } else { a[c1].id=i; a[c1++].val=val; } } sort(a,a+c1); sort(b,b+c2); int l1=0,l2=0; int id0,id1; while(l1 =c1)l2++;//如果其中一种颜色没了,那么最后一个连的另外一种颜色的节点就没有节点连了(也就是叶子结点) } else { cout< <<' '< <<' '< < =c2)l1++; } } while(l1
代码2(写残版):
我居然用了优先队列,患上STL综合症的我脑残了。
#includeusing namespace std;const int N=1e5+5;struct node{ int col; int val; int id; friend bool operator>(node a,node b) { return a.val>b.val; }}a[N];int main(){ int n; priority_queue ,greater >q0,q1; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i].col>>a[i].val; a[i].id=i; if(a[i].col)q1.push(a[i]); else q0.push(a[i]); } int id0,id1; while(q0.size()&&q1.size()) { node temp0=q0.top(); node temp1=q1.top(); id0=temp0.id; id1=temp1.id; if(temp0.val