CF1242C. Sum Balance
题目描述
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的更多相关文章
- 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 ...
- Codeforces Round #599 (Div. 2) E. Sum Balance
这题写起来真的有点麻烦,按照官方题解的写法 先建图,然后求强连通分量,然后判断掉不符合条件的换 最后做dp转移即可 虽然看起来复杂度很高,但是n只有15,所以问题不大 #include <ios ...
- [Codeforces 1242C]Sum Balance
Description 题库链接 给你 \(k\) 个盒子,第 \(i\) 个盒子中有 \(n_i\) 个数,第 \(j\) 个数为 \(x_{i,j}\).现在让你进行 \(k\) 次操作,第 \( ...
- SQL Server 中存储过程的练习
建库建表建约束 插入数据 --建库建表建约束和插入测试数据 use bankDB go --1.完成存款,取款业务--存款 create proc usp_takeMoney ),),)=null,@ ...
- order_by_、group_by_、having的用法区别
写于 2012-11-20 22:14 doc文档上. Having 这个是用在聚合函数的用法.当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算.运算完后 ...
- [POJ] #1004# Financial Management : 浮点数运算
一. 题目 Financial Management Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 173910 Acc ...
- HW4.7
public class Solution { public static void main(String[] args) { double rate = 0.05; double balance ...
- pubwin会员合并
此博文已移至爬不稳独立博客:www.pubwin2009.net连接:http://www.pubwin2009.net/index.php/post/15.html 我们说下过程(这里,我们要求两个 ...
- 事务,Oracle,MySQL及Spring事务隔离级别
一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割:一致性 (consiste ...
随机推荐
- python基础学习笔记-切片难点
numbers = [1,2,3,4,5,6,7,8,9,10] print(numbers[5::-2]) print(numbers[10:5:-2]) print(numbers[:5:-2]) ...
- 【Python开发】【神经网络与深度学习】网络爬虫之python实现
一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一 ...
- python小游戏2
import hashlib 过段时间会来解释下hashlib的源码(能力有限请大家谅解)#根据md5模块来加密密码 def pwd_md5(pwd): ''' 加密用户输入过来的密码 :param ...
- mysql主要性能监控指标
1.系统mysql的进程数 ps -ef | grep "mysql" | grep -v "grep" | wc –l 2.Slave_running mys ...
- SQL中前置0和后置0的处理问题
在sql语句中经常遇到处理前置和后置数据的问题 1.首先使用convert转化函数对预处理的数据进行转化,CONVERT()函数可以将制定的数据类型转换为另一种数据类型 MySQL 的CAST()和C ...
- 阿里云安装filezilla
1.连接服务器 ssh 或者 远程连接 到服务器: 2.安装相应软件 安装EPEL,EPEL是yum的一个软件源,里面包含了许多基本源里没有的软件: yum -y install epel-relea ...
- dict 小习题
1.请将列表中的每个元素通过 "" 链接起来. users = ['大黑哥','龚明阳',666,'渣渣辉'] a='' for i in users: i=str(i) a=a+ ...
- DAX/PowerBI系列 - 累计总计(Cumulative Total, Running Total)
DAX/PowerBI系列 - 累计总计(Cumulative Total) 2017/07/23 更新:B列公式(见最后) 2019/08/08 更新:在可视化数据的时候,一定要选择日期维度的日期列 ...
- RabbitMQ入门教程(十四):RabbitMQ单机集群搭建
原文:RabbitMQ入门教程(十四):RabbitMQ单机集群搭建 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://b ...
- 吴恩达深度学习:python中的广播
1.python中的广播: (1)广播是一种手段,可以让python代码执行得更快,我们来看看python实际如何执行. 下面矩阵列出了100克苹果.牛肉.鸡蛋和蛋白质中含有的碳水化合物.蛋白质和脂肪 ...