打击犯罪(black)

题目描述

题目描述 Description

某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团,犯罪集团的危险程度唯一由集团内的犯罪团伙数量确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为n)。现在当地警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过n/2。为达到最好的效果,他们将按顺序打击掉编号1到k的犯罪团伙,请编程求出k的最小值。

输入描述 Input Description

 第一行一个正整数n。接下来的n行每行有若干个正整数,第一个整数表示该行除第一个外还有多少个整数,若第i行存在正整数k,表示i,k两个团伙可以直接联系。

输出描述 Output Description

一个正整数,为k的最小值

样例输入 Sample Input

7
    2 2 5
    3 1 3 4
    2 2 4
    2 2 3
    3 1 6 7
    2 5 7
    2 5 6

样例输出  Sample Output

1

题目分析

方法一:

从第一个数开始 求出去掉这个数之后的危险程度

然后和 n/2 比较 如果说大于它 就继续删除下一个数字

(两个数字同时删除 求出最大危险程度)

知道最大危险程度小于 n/2 时 停止循环

错误:

如果第一次删除的数字不符合条件

做下一次循环之前 要进行一系列的归零操作

要把上一次循环用到的数组 变量内的数 全部清零

方法二:

二分 删除的数字越小 最大危险程度越大

反比关系 所以就能用二分法求

每一次循环都求出中间点所对应的最大危险程度

(中间点即删除mid和mid之前的所有的点 并非一个点)

求出mid所对应的危险程度 就和 n/2 比较

然后不断地缩小比较的范围 就能二分求出答案

错误:

二分的时候 不需要像邻接矩阵一样把查过的点都删除

因为如果删除了 下一次的查找范围如果在之前的话

就必须再重新构建矩阵 直接不用删除 在 k+1 个开始查找即可

这样 矩阵里面的数字没有变 也找到了mid对应的危险程度

源代码

方法一:

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
void dfs(int);
void find_group();
int n,x,m,y,u,w[1005][1005],group[1005],t,ans[1005],a,maxx,g;
bool vis[1005];
int main()
{
	freopen("black3.in","r",stdin);
	scanf("%d",&n);
	m=n/2;
	for(int i=1;i<=n;i++)
		{
		scanf("%d",&x);
		for(int j=1;j<=x;j++)
			{
			scanf("%d",&y);
			w[i][y]=1;
			w[y][j]=w[j][y];
			}
		}
	for(int k=1;k<=n;k++)
	{
		memset(group,0,sizeof(group));
		memset(ans,0,sizeof(ans));
		memset(vis,false,sizeof(vis));
		maxx=0;
		u=k;
		for(int j=k+1;j<=n;j++)
			if(w[k][j]==1)
			{
			w[k][j]=0;
			w[j][k]=w[k][j];
			}
		find_group();
		if(maxx>m)
			continue;
		else
		{
			a=k;
			break;
		}
	}
	printf("%d",a);
	return 0;
}
void find_group()
{
	g=0;
	for(int i=u+1;i<=n;i++)
		if(group[i]==0)
		{
			g++;
			dfs(i);
			maxx=max(maxx,ans[g]);
		}
	t=g;
}
void dfs(int q)
{
	vis[q]=true;
	group[q]=g;
	ans[g]++;
	for(int l=u+1;l<=n;l++)
		if(vis[l]==false&&w[q][l]==1)
		dfs(l);
}

  

方法二:

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
void dfs(int);
void find_group();
int n,x,m,y,u,w[1005][1005],group[1005],t,ans[1005],a,maxx,g;
bool vis[1005];
int main()
{
	freopen("black3.in","r",stdin);
	scanf("%d",&n);
	m=n/2;
	for(int i=1;i<=n;i++)
		{
		scanf("%d",&x);
		for(int j=1;j<=x;j++)
			{
			scanf("%d",&y);
			w[i][y]=1;
			w[y][i]=w[j][i];
			}
		}
	for(int k=1;k<=n;k++)
	{
		memset(group,0,sizeof(group));
		memset(ans,0,sizeof(ans));
		memset(vis,false,sizeof(vis));
		maxx=0;
		u=k;
		for(int j=k+1;j<=n;j++)
			if(w[k][j]==1)
			{
			w[k][j]=0;
			w[j][k]=w[k][j];
			}
		find_group();
		if(maxx>m)
			continue;
		else
		{
			a=k;
			break;
		}
	}
	printf("%d",a);
	return 0;
}
void find_group()
{
	g=0;
	for(int i=u+1;i<=n;i++)
		if(group[i]==0)
		{
			g++;
			dfs(i);
			maxx=max(maxx,ans[g]);
		}
	t=g;
}
void dfs(int q)
{
	vis[q]=true;
	group[q]=g;
	ans[g]++;
	for(int l=u+1;l<=n;l++)
		if(vis[l]==false&&w[q][l]==1)
		dfs(l);
}

  

时间: 2024-08-02 13:46:03

打击犯罪(black)的相关文章

codevs 5971 打击犯罪

题目描述 Description 某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团,犯罪集团的危险程度唯一由集团内的犯罪团伙数量确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为n).现在当地警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过n/2.为达到

一本通 P1386 【打击犯罪】

题库 :一本通 题号 :1386 题目 :打击犯罪 link :http://ybt.ssoier.cn:8088/problem_show.php?pid=1386 O(n3)思路 :此题数据太水,n3就能卡过.暴力枚举1 ~ n,每次都重新将并查集初始化并且按题目输入将所有 >= k(1 <= k <= n)的点合并(及打击掉1 ~ k的犯罪团伙,他们不合并).从1 ~ n枚举直到找到最小的k满足所有犯罪团伙中的最大的一个的危险程度不超过n / 2,直接输出k. code : 1 #

codevs 5971 打击犯罪 x

题目描述 Description 某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团,犯罪集团的危险程度唯一由集团内的犯罪团伙数量确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为n).现在当地警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过n/2.为达到

【题解】打击犯罪

题目描述 某个地区有n(n≤1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1至n,他们有些团伙之间有直接联系,,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团,犯罪集团的危险程度由集团内的犯罪团伙数量唯一确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为n).现在当地 警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过 n/2.为达到最好的效果,他们将按

&lt;wzoi449&gt;打击犯罪

#include <bits/stdc++.h> #define maxn 1005 #define ms(s) memset(s,0,sizeof(s)) #define in(x) scanf("%d",&x) using namespace std; int n,f[maxn],g[maxn][maxn]; int cnt[maxn]; int find(int a){ if(f[a]==a){ return a; } else { f[a]=find(f[a

chinacloud大数据新闻

2015年大数据发展八大趋势   (0 篇回复) “数据很丰满,信息很骨感”:Sight Machine想用大数据的方法,打碎两者间的屏障   (0 篇回复) 百度携大数据"圈地"证券业 "BAT"开启互联网金融新战场   (0 篇回复) 码农的春天到了?   (0 篇回复) 浪潮大数据一体机出招 装备科研“最强大脑”   (0 篇回复) 方物软件承担国家“核高基”重大专项研发   (2 篇回复) 2013互联网大会透露的热点与新趋势   (1 篇回复) 大数据从幕

网络黑色产业调查:职业黑客推动洗钱贩卖身份

网络黑色产业调查:职业黑客推动洗钱贩卖身份 原标题:网络黑色产业调查 1 导读 网络犯罪呈现产业链化,分工日趋明细.专业化黑色利益链条的出现,让交易.勾连的双方,可能无须相互认识或见面.社交软件成为网络犯罪的重要工具和阵地,在某些情况下,甚至影响社会稳定.威胁国家安全. 本报记者 王峰 北京报道 “简直是腹背受制”,黄安(化名)谈到2015年8月向公安机关报案的感受时说. 黄安是某航空公司机票销售部门的负责人.2015年7月31日开始,这家航空公司的网上销售机票B2B系统就开始遭受黑客攻击,攻击

提升大数据数据分析性能的方法及技术(一)

关于此文 最近在忙着准备校招的相关复习,所以也整理了一下上学期上课时候的学到的一些知识.刚好发现当时还写了一篇类似于文献综述性质的文章,就在这里贴出来.题材是关于大数据的,也是比较火热的一个话题,虽然现在接触的项目与大数据不太有关联,可能以后也不一定从事这方面的工作吧.就IT行业的研究成果来讲国外期刊无论是发表速度还是质量都是高于国内,所以参考的大部分都是当时最新在核心期刊上发表的论文,参考文献在最后一一列出.因为文章没有多少自己的创新点,仅仅是最新.最热技术或者分析的一个总结,所以放上来仅仅是

iOS取证将如漫漫长夜

日前因恐攻一案,FBI对一支已上锁的iPhone 5c束手无策,美国法院出具命令要求苹果配合,但被苹果公司执行长库克以维护安全及隐私为由悍然拒绝. 平心而论,各有其立场,但在一个犯罪案件之中,真的可以容许因设备厂商所建立的”完美”机制,而使得重要迹证无从提取吗?若然如此,法律有何用?执法单位的公权力在iDevice的面前,就这么轻易的被厂商所制造的技术门坎给挡住,不得其门而入?这不如同CrytoLocker勒索病毒一样,是对现代计算机科技安全的最大讽刺吗? 别误会我不是主张个人隐私不重要,而是希