题目描述

k组数,每组ni个,数互不相同

把每组数中的一个移到其他组(或者不移动),使得最终每组数的个数不变且总和相等

k<=15,ni<=5000

题解

最终的移动关系一定为若干个环

枚举每个环的起点,找到一个数补上去使得和等于平均值

因为互不相同,所以出边(找到的数)唯一

判断是否能成环,并且把对应的选择方案记下

预处理的时间为O(k*∑ni)

最后O(3^n)dp即可

code

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define fo(a,b,c) for (a=b; a<=c; a++)
#define fd(a,b,c) for (a=b; a>=c; a--)
using namespace std; struct type{
int s,x,y;
} a[75001];
int p[16]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384};
int b[16][5001];
int c[16];
int d[32768][16][2]; //d[][1][1] is special
int d2[16][2];
bool bz[16];
bool f[32768];
int g[32768];
int ans[16][2];
int D[16];
int n,I,J,i,j,k,l,len,S,s,L,tot;
long long Sum[16];
long long sum; bool cmp(type a,type b)
{
return a.s<b.s;
} int get(long long t)
{
int l=1,r=len,mid; while (l<r)
{
mid=(l+r)/2; if (a[mid].s<t)
l=mid+1;
else
r=mid;
} if (a[l].s==t)
return l;
return -1;
} int main()
{
// freopen("c.in","r",stdin); scanf("%d",&n);L=p[n]*2-1;
fo(i,1,n)
{
scanf("%d",&c[i]);
fo(j,1,c[i])
scanf("%d",&b[i][j]),a[++len]={b[i][j],i,j},sum+=b[i][j],Sum[i]+=b[i][j];
} if (sum%n)
{
printf("No\n");
return 0;
}
sum/=n; sort(a+1,a+len+1,cmp); fo(I,1,n)
{
fo(J,1,c[I])
{
memset(bz,0,sizeof(bz)); S=p[I]; tot=1;
d2[1][0]=I;
d2[1][1]=b[I][J]; j=I;
s=b[I][J]; l=get(sum-(Sum[j]-s)); while (!bz[j])
{
bz[j]=1; if (l==-1 || bz[a[l].x])
break; j=a[l].x;
s=a[l].s;
S|=p[j]; ++tot;
d2[tot][0]=j;
d2[tot][1]=l; l=get(sum-(Sum[j]-s));
} if (l!=-1 && a[l].x==I && a[l].y==J)
{
f[S]=1;
fo(j,1,tot)
{
d[S][j][0]=d2[j][0];
d[S][j][1]=d2[j][1];
}
}
}
} fo(i,1,L)
{
if (f[i])
g[i]=i;
else
{
for (j=(i-1)&i; j; j=(j-1)&i)
if (f[j] && g[i^j])
{
g[i]=j;
break;
}
}
} if (g[L])
{
for (j=L; j; j^=g[j])
{
tot=0;
fo(i,1,n)
if (g[j]&p[i])
++tot; ans[d[g[j]][1][0]][0]=d[g[j]][tot][0];
ans[d[g[j]][1][0]][1]=d[g[j]][1][1];
fo(i,2,tot)
{
ans[d[g[j]][i][0]][0]=d[g[j]][i-1][0];
ans[d[g[j]][i][0]][1]=a[d[g[j]][i][1]].s;
}
} printf("Yes\n");
fo(i,1,n)
printf("%d %d\n",ans[i][1],ans[i][0]);
}
else
printf("No\n");
}

CF1242C. Sum Balance的更多相关文章

  1. Codeforces Round #599 (Div. 1) C. Sum Balance 图论 dp

    C. Sum Balance Ujan has a lot of numbers in his boxes. He likes order and balance, so he decided to ...

  2. Codeforces Round #599 (Div. 2) E. Sum Balance

    这题写起来真的有点麻烦,按照官方题解的写法 先建图,然后求强连通分量,然后判断掉不符合条件的换 最后做dp转移即可 虽然看起来复杂度很高,但是n只有15,所以问题不大 #include <ios ...

  3. [Codeforces 1242C]Sum Balance

    Description 题库链接 给你 \(k\) 个盒子,第 \(i\) 个盒子中有 \(n_i\) 个数,第 \(j\) 个数为 \(x_{i,j}\).现在让你进行 \(k\) 次操作,第 \( ...

  4. SQL Server 中存储过程的练习

    建库建表建约束 插入数据 --建库建表建约束和插入测试数据 use bankDB go --1.完成存款,取款业务--存款 create proc usp_takeMoney ),),)=null,@ ...

  5. order_by_、group_by_、having的用法区别

    写于 2012-11-20 22:14  doc文档上. Having 这个是用在聚合函数的用法.当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算.运算完后 ...

  6. [POJ] #1004# Financial Management : 浮点数运算

    一. 题目 Financial Management Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 173910   Acc ...

  7. HW4.7

    public class Solution { public static void main(String[] args) { double rate = 0.05; double balance ...

  8. pubwin会员合并

    此博文已移至爬不稳独立博客:www.pubwin2009.net连接:http://www.pubwin2009.net/index.php/post/15.html 我们说下过程(这里,我们要求两个 ...

  9. 事务,Oracle,MySQL及Spring事务隔离级别

    一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割:一致性 (consiste ...

随机推荐

  1. LeetCode.941-有效山形数组(Valid Mountain Array)

    这是悦乐书的第360次更新,第387篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第222题(顺位题号是941).给定一个整数数组A,当且仅当它是一个有效的山形数组时返回 ...

  2. gitlab ssh 免密登录

    打开本地git   使用 ssh-keygen 工具 输入命令  ssh-keygen -t rsa -C '你的邮箱账号' 接下来输入密码 确认密码 找到目录 找到公钥 在 gitlab 用户设置  ...

  3. 【LeetCode】309、最佳买卖股票时机含冷冻期

    Best Time to Buy and Sell Stock with Cooldown 题目等级:Medium 题目描述: Say you have an array for which the ...

  4. [转帖]linux进程管理总结

    linux进程管理总结 https://www.cnblogs.com/chenfangzhi/p/10660355.html 高手总结的.. 看出来我是菜逼. 目录 一.进程相关的概念 二.关闭会话 ...

  5. Javascript设计原则

    Javascript设计原则 在面向对象的程序设计思想中, 我们能够遵循一些原则能够让我们开发代码时结构层次清晰, 更具说服力, 可谓是事半功倍. 做到这一点我们掌握一些程序设计原则是非常有利的, 如 ...

  6. java操作ElasticSearch(es)进行增删查改操作

    有时间是要了解一下ES这个东西的~ ---------------------------------------------------------------------------------- ...

  7. Vue源码解读-构造函数

    src/core/instance/index.js此文件主要实现了Vue初始化 // 引入模块 import { initMixin } from './init' import { stateMi ...

  8. RabbitMQ入门教程(九):首部交换机Headers

    原文:RabbitMQ入门教程(九):首部交换机Headers 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog ...

  9. 出大问题!webpack 多入口&&html模板在后端

    新公司前后端不分离,后端用的是php的twig 我用webpack做多入口文件的打包,虽然成功了.但是引入js和css是在twig上写死的根据文件名. 一开始没问题,因为就定死了那么几个global. ...

  10. Eclipse创建Maven多模块工程Module开发(图文教程)

    自己研究了下Eclipse用Maven多模块工程Module开发,跟大家分享一下! 功能模块来分Module,跟java的package类似,一般是按照的功能模块分module,比如:sso/cas/ ...