[ZOJ1462][POJ1112] Team Them Up!

SAP FB03凭证修改实战:巧用BAPI FI_DOCUMENT_CHANGE更新抬头与行项目 本文详细介绍了SAP FB03凭证修改的实战技巧,重点解析了BAPI FI_DOCUMENT_CHANGE的使用方法。通过该接口,用户可以在不冲销原凭证的情况下直接更新抬头文本(BKTXT)和行项目文本(SGTXT),确保凭证编号连续且符合审计要求。文章包含核心机制解析、完整实现步骤、错误处理方案以及高级应用场景,帮助开发者高效完成SAP财务凭证修改。 阅读详情

ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=462

POJ: http://poj.org/problem?id=1112


题目大意:

把一些人分成两组,每一组中的人满足任意两个人都相互认识,且要求两组的人数差尽量小。若不存在分组情况输出No solution

解题思路:

首先来判断是否存在可行的分组情况。

首先建立无向图e,若两顶i和j之间存在边(e[i][j]==true),表示i和j不能分在同一个组里。(e[i][j]==true当且仅当i和j不相互认识,即i不认识j或者j不认识i)。接下来用DFS进行0-1染色判断这一幅图是否是二分图,并且统计每一个连通块(都是一个二分图)的x和y集合中的顶分别有多少。

接下来用一个最简单的动态规划——背包,把每一个连通块的X和Y集合塞到两个不同的组里去。回溯统计每一组的人员,输出即可。

在POJ上1AC,之后交到ZOJ上的时候一直WA,不知道为什么。晚上重新看了一遍才发现存储边的数组e[maxn][maxn]的清零不知道我在什么时候手抽删掉了,导致多数据的时候过不了,真是罪过。


源代码:(For ZOJ)


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 110

int n;
bool e[maxn][maxn];
int v[maxn], x[maxn][maxn], y[maxn][maxn];

int min(int x, int y){return (x<y)?x:y;}
int max(int x, int y){return (x>y)?x:y;}
int abs_usr(int x){return (x>0)?x:-x;}

void init()
{
    int tmp;
    scanf("%d", &n);
    memset(e, 0, sizeof(e));
    for (int i=0; i<n; i++)
    {
        while (scanf("%d", &tmp)==1 && tmp)
            e[i][tmp-1]=1;
    }
    for (int i=0; i<n; i++)
        for (int j=0; j<i; j++)
            if (e[i][j]&&e[j][i])               //互相认识(求补图,无向图) 
                e[i][j]=e[j][i]=0;
            else
                e[i][j]=e[j][i]=1;
}

bool dfs(int k, int p, int xx)                  //当前访问第k个结点,第p个联通片 
{
    for (int i=0; i<n; i++)
    {
        if (i!=k && e[i][k])
        {
            if (v[i]==-1)
            {
                if (xx==1)
                    y[p][++y[p][0]]=i;
                else
                    x[p][++x[p][0]]=i;
                v[i]=xx;
                if (!dfs(i, p, 1-xx)) return false;
            }
            else
            {
                if (v[i]==v[k]) return false;   //如果k有邻顶是同色的,则不是二分图 
            }
        }
    }
    return true;
}

bool solve()
{
    int p=0, ans, g1;
    int f[maxn][maxn*2];
    
    memset(v, 255, sizeof(v));
    
    for (int i=0; i<n; i++)
        if (v[i]==-1)
        {
            v[i]=0; x[p][0]=1; x[p][1]=i; y[p][0]=0;
            if (!dfs(i, p, 1)) return false;
            p++;
        }
    
    memset(f, 255, sizeof(f));                      //f[i][j], j = group1 - group2 + maxn
    f[0][x[0][0]-y[0][0]+maxn]=0;                   //gourp1=x[0][0] group2=y[0][0]
    f[0][y[0][0]-x[0][0]+maxn]=1;                   //group1=0 group2=y[0][0]
    
    for (int i=1; i<p; i++)                 //f[i][j]表示前i个联通片达到人数差值为j时,第i个联通片选的是x(0)还是y(1)
    {
        for (int j=0; j<=2*maxn; j++)
        {
            if (f[i-1][j]!=-1){             //group1+x[i][0], group2+y[i][0]
                f[i][j+x[i][0]-y[i][0]]=0;
            }
            if (f[i-1][j]!=-1){             //group1+y[i][0], group2+x[i][0]
                f[i][j+y[i][0]-x[i][0]]=1;
            }
        }
    }
    ans=-1;
    for (int j=0; j<=2*maxn; j++)
        if (f[p-1][j]!=-1)
        {
            if (ans==-1 || abs_usr(j-maxn)<abs_usr(ans-maxn))
                ans=j;
        }
        
    g1=0;
    for (int i=p-1; i>=0; i--)
    {
        if (f[i][ans]==0)
        {
            g1+=x[i][0];
            for (int j=1; j<=x[i][0]; j++) v[x[i][j]]=1;
            for (int j=1; j<=y[i][0]; j++) v[y[i][j]]=2;
            ans-=(x[i][0]-y[i][0]);
        }
        else
        {
            g1+=y[i][0];
            for (int j=1; j<=x[i][0]; j++) v[x[i][j]]=2;
            for (int j=1; j<=y[i][0]; j++) v[y[i][j]]=1;
            ans-=(y[i][0]-x[i][0]);
        }
    }
    printf("%d", g1); for (int i=0; i<n; i++) if (v[i]==1) printf(" %d", i+1); printf("\n");
    printf("%d", n-g1); for (int i=0; i<n; i++) if (v[i]==2) printf(" %d", i+1); printf("\n");
    return true;
}

int main()
{
//    freopen("test.txt","r",stdin);
//    freopen("ans.txt","w",stdout);
    int cs;
    scanf("%d", &cs);
    for (int css=1; css<=cs; css++)
    {
        if (css!=1) printf("\n");
        init();
        if (!solve()) printf("No solution\n");
    }
    return 0;
    
}



STM32H7 FOC控制时序优化与PWM中点更新策略 在永磁同步电机(PMSM)的磁场定向控制(FOC)系统中,控制时序精度是决定电流环带宽、观测器收敛性与动态响应能力的基础要素。其核心在于理解PWM生成、ADC采样与控制计算三者之间的硬件级时间耦合关系——尤其在中心对齐模式下,标准更新机制引入的半周期延迟会破坏电压-电流瞬时映射,导致滑模观测器失配与高频相位滞后。通过将PWM更新事件绑定至重复计数器(RCR)清零点,可实现控制指令在开关周期中点生效,使等效电压矢量中心与计算时刻严格对齐。该策略显著提升系统确定性,为20 kHz以上高频电流环提供物理支撑,并广 阅读详情

相关推荐

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

jzoj3782 [NOIP2014模拟8.17] 组队

Description 你的任务是将一群人分到两个队伍中,使得: 1、每个人都属于一个队伍。 2、每个队伍至少有一个人。 3、每个队伍的任意一个人都认识其他人。 4、两支队伍的人数尽可能接近。 这个任务可能有多组解,你可以输出任意一种。 注意:认识是单向的且没有传递性。 对于分值为 30%的数据,N 对于剩余分值为 70%的数据,N [评分标准] 该题采用捆绑测试点评

olahiuj的博客 437

浅谈声发射振动复合传感器

浅谈声发射振动复合传感器 随着全球经济和自动化工业的迅速发展,人们对设备故障特别是轴承类的故障诊断也日益重视起来了。 为满足客户对旋转仪器轴承异常的精准诊断,单一的依靠振动信号或声信号分析,是很难兼顾轴承的多种异常情况的。 为此,市面上开始着手研发出了可同时分析机械设备的振动信号和声信号的复合型传感器。 初期的复合型传感器主要有 2 种类型,下面以 A、B 来举例说明。 A 型是在被测物表面不同的 2 个位置分别放置声发射(AE)传感器和加速度(ACC)传感器,它虽能一定程度...

pxtech的博客 1151

UVA1627 团队分组

题目大意:有n个人,把他们分成非空的两组,使得每个人都被分到一组,要求组内成员相互认识,并且两组人数差距最小。多解输出任意方案,无解输出No solution. 根据题意,如果有两个人不是互相认识,那么这两个人只能被分到不同的组。于是想到在不是相互认识的人之间连上一条边(注意一仅仅是一个人认识另一个人也需要连边),这样我们就得到了若干个连通分量。对于每个连通分量,相邻的两个点是必须分到两个组的,...

SuperGate的博客 480

从零到一:如何用YOLOv8和PyQt5打造一个高效的路面坑洞检测系统

本文详细介绍了如何利用YOLOv8和PyQt5开发一个高效的路面坑洞检测系统。从环境配置、数据采集标注到模型训练优化,再到PyQt5界面开发与系统集成,提供了完整的实战指南。该系统结合深度学习技术,显著提升了道路检测的准确性和效率,适用于各类道路维护场景。

weixin_29047919的博客 308

CrackerXI+脱壳实战:解决iOS应用逆向中的加密文件问题

本文详细介绍了如何使用CrackerXI+工具对iOS应用进行脱壳,解决App Store应用因FairPlay DRM加密而无法进行静态分析的难题。通过图形化界面一键操作,CrackerXI+能高效获取解密后的可执行文件,为逆向工程奠定基础。文章涵盖工具选型、实战步骤及常见问题排查,是iOS逆向入门与进阶的实用指南。

seed的博客 257

poj 1112 经典最小差值dp(超级好题)

题意: 给你n个人,告诉你谁认识谁。要求将他们分成两组,每组的人相互都认识,且每组人数尽量接近(人数的差值最小)。 思路: 先抽象成二分图,然后看能不能二分,如果不能直接输出,如果能,就抽象成可以dp的问题,用dp找差值最小的解。 抽象过程: 对于每一个节点,都有跟他相互连接的一堆节点,组成一个强连通分量,然后给这个强连通分量染色。问题就抽象成了这样, 有t个物品,每个物品有u价值和v价值,同时你...

Fawkess的博客 983

倾斜摄影与激光点云融合建模:Photoscan+ContextCapture避坑指南

本文详细解析了倾斜摄影与激光点云融合建模的技术流程,重点介绍了使用Agisoft Metashape(原Photoscan)与ContextCapture进行数据融合的实战指南。文章深入探讨了数据预处理、坐标系统一、空三计算策略及在ContextCapture中进行点云配准等关键步骤,旨在帮助从业者规避常见陷阱,高效构建兼具高精度几何与真实纹理的三维实景模型。

weixin_29062613的博客 249

洛谷P1285 队员分组

罗哥哥

bhsCB的博客 447

Linux Namespace隔离实战:dd/mkfs/mount/unshare构建终极沙箱

内存占用 | 512MB+ | **<10MB** | 50倍节省 || 启动时间 | 15-45秒 | **0.1-0.5秒** | 100倍加速 || 磁盘空间 | GB级 | **MB级** | 显著减少 || 系统调用性能 | 有损耗 | **原生速度** | 零损耗 |

Loving_enjoy的博客 398

QCM2290 PM-3 如何让mirco-usb支持关机充电

PM4125-3插入type-C触发开机进入关机充电的CC脚中断条件是否可以软件上屏蔽, 做到只通过VBUS中断即可触发进入关机充电模式,达到和PM4125-2的效果一样只要插入micro USB 就可以触发进入关机充电模式。硬件团队提议修改寄存器 SCHG_L_MISC_SYSOK_CFG 0x164A bit[4] 目前修改如下 — a/BOOT.XF.4.1/boot_images/QcomPkg/Library/PmicLib/target/Agatti_pmCocos/psi/pm_confi

墨染天玑的博客 441

POJ 1112 二分图判定 + DP

题意 传送门 POJ 1112 Team Them Up! 题解 建立原图的补图,即若两个人之间不相互认识,则连一条边;此时一条边的两个端点不能分在同一组中。那么判断是否存在可行的分组方案,染色法进行二分图判定即可。由于 N≥2N\geq 2N≥2,则若补图是二分图,则满足每一组至少存在一个人。 记录补图连通分量 iii 染色为 kkk 的节点数 sum[i][k]sum[i][k]sum[i][k]。设两个组为 A,BA,BA,B,则问题转化为求解从每一个连通分量中选取染为某个颜色的节点集合加入 AAA,

neweryyy的博客 288

【TC3xx芯片】TC3xx芯片UCB详解

TC3xx芯片UCB详解

qq_36056498的博客 1万+

poj1112 2010.4.15

poj1112 2010.4.15 图论和DP结合。 首先,我们分析一下分组的要求: 1、把所有的人分成2组,每组至少有1人; 2、每组之间的人两两认识。     非常明显,如果存在两个人A和B,A不认识B,或B不认识A,那么A和B一定不能分在同一组。因此,我们以人为结点重新构造一个图G。假如A和B不能分在同一组,那么就在G中增加一条无向边(A,B)。这样,我们就得到了一个较为“单纯”的

Batman_的博客 688

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【POJ 1112】Team Them Up!(补图+dp(背包))

Team Them Up! Time Limit:1000MS Memory Limit:10000K Total Submissions:7623 Accepted:2047 Special Judge Description Your task is to divide a number of persons into two ...

weixin_30394633的博客 246

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【练习试题】分组(poj1112 Team Them Up!)

【练习试题】分组(Poj1112 Team Them Up!) Description 你的任务是把一些人分成两组,使得: •每个人都被分到其中一组; •每个组都至少有一个人; •一组中的每个人都认识其他同组成员; •两组的成员人数尽量接近。 这个问题可能有多个解决方案,你只要输出两组人数之差的绝对值即可,或者输出这样的分组法不存在。

袋鼠与蒟蒻 1508

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

poj 1112

二着色+DP 在不是互相认识的节点之间连一条边,最后得到由多个连通分量构成的图。把图中节点分为两组,保证图中每条边的两个顶点不能再同一组。对每个连通分量进行二着色,每个连通分量的点就分为了a,b两组。假定最后整个图分为1,2两组。每个连通分量的a,b两组,无非一个在1组一个在2组,通过DP,确定每个连通分量中a,b哪个在1组,哪个在2组时最有。然后就是DP的过程,没想出来,看了其他人的结题报告。...

weixin_30511107的博客 150

【poj1112】 Team Them Up!

http://poj.org/problem?id=1112(题目链接) 题意   将n个人分成两组,每个人有认识的人,要求每一组中的人互相认识,并且两组人数之差尽可能的小,求如何分。 Solution   二分图染色的裸题,比较麻烦的是dp统计答案。。下午急着去打球,照着hzwer的程序码了一遍。 代码 // poj1112 #include<algorithm>...

weixin_30483013的博客 168

POJ1112——Team Them Up!(动态规划,二分图判定)

Team Them Up! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7454 Accepted: 2011 Special Judge Description Your task is to divide a number of perso

say_c_box的博客 1296

不畏浮云遮望眼--离散数学和组合数学

不畏浮云遮望眼,基础很重要! 离散数学是算法和数据结构的基础,而算法和数据结构又是什么的基础?不解释了。 1.《离散数学及其应用》作者: (美)Kenneth H. R出版社: 机械工业出版社出版年: 2007-6页数: 804定价: 79.00元丛书: 计算机科学丛书ISBN: 9787111203261  2.《组合数学》作者: (美)布鲁迪(Brualdi/R.A.)/冯舜玺等出版社: 机械

深度Java 4476

poj1112 team them up

http://www.elijahqi.win/archives/1138 Description Your task is to divide a number of persons into two teams, in such a way, that: everyone belongs to one of the teams; every team has at least one...

Elijahqi 409

【Baltic2008】黑手党(Mafia)(BSOI2891)

【Baltic2008】黑手党(Mafia)(BSOI2891)OI最大流点限制网络流字典序   匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控. 对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得去掉这些车站后,匪徒无法从原定的初始点到达目标点        图中方框左上角的小数字是顶点号,中间大数字是在该点的费用。本题的最小费用是拦信1,4点,总费用是5

袋鼠与蒟蒻 3197

POJ_1112_Team Them Up!

代码#include<iostream>#defineinf1000000usingnamespacestd;constintMAXN=101;intmap[MAXN][MAXN];intid[2][MAXN];intcolor[MAXN];intdp[MAXN][MAXN];inttmp[MAXN][MAXN];struct{intc1,c...

weixin_30340775的博客 163

Team them up! UVA - 1627 (二分图判定+01背包+扩大区间组合数+好题)

传送门 题意:给出n个人,现在给出了每个人都认识谁,问能将这些人分成两组么,并且每组中的人都互相认识,况且最后两组的人数差尽量小。 题解:首先要明白的是每个组中只能放相互认识的人,那么单方面认识或者不认识的就不能放在一组,那就将单方面认识或者不认识的人相互连根线,然后进行二分图判断,如果不符合二分图的条件,直接输出无解,如果符合二分图的条件,那么接着可以将这些联通分量进行求差值,比如现在出现了...

肘子的博客 380

Poj 1112 Team Them Up!

首先分析这道题目,题目给出的是一个有向图,即如果有A认识B,但不一定有B认识A。但是在所分配的组里面,任意两个人都要互相认识。 1、 先读入数据建立有向图,然后对这个有向图进行处理,如果两个点之间的边是单向边,就认为两个点之间无边(因为这两个人不互相认识),对于两个点间的双向边,即建立一条无向边(这两个人互相认识),这样就可以把一个有向图转化为一个无向图。 2、 将这个无向图转化为它的

Mr.Phoebe的专栏 1235
上一篇: [ZOJ1413][POJ1021] 2D Nim 非人品解法
下一篇: [POJ2447] RSA
program_shun
博客等级 码龄17年 10粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值