10 noip 关押罪犯 解题报告

题目描述 Description

S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极

不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨

气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之

间的积怨越多。如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并

造成影响力为c 的冲突事件。

每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,

然后上报到S 城Z 市长那里。公务繁忙的Z 市长只会去看列表中的第一个事件的影响力,

如果影响很坏,他就会考虑撤换警察局长。

在详细考察了N 名罪犯间的矛盾关系后,警察局长觉得压力巨大。他准备将罪犯们在

两座监狱内重新分配,以求产生的冲突事件影响力都较小,从而保住自己的乌纱帽。假设只

要处于同一监狱内的某两个罪犯间有仇恨,那么他们一定会在每年的某个时候发生摩擦。那

么,应如何分配罪犯,才能使Z 市长看到的那个冲突事件的影响力最小?这个最小值是少?

输入描述 Input Description

第一行为两个正整数N 和M,分别表示罪犯的数目以及存在仇恨的罪犯对数。

接下来的M 行每行为三个正整数aj,bj,cj,表示aj 号和bj 号罪犯之间存在仇恨,其怨气值为cj。数据保证且每对罪犯组合只出现一次。

输出描述 Output Description

共1 行,为Z 市长看到的那个冲突事件的影响力。如果本年内监狱

中未发生任何冲突事件,请输出0。

样例输入 Sample Input

4 6

1 4 2534

2 3 3512

1 2 28351

1 3 6618

2 4 1805

3 4 12884

样例输出 Sample Output

3512

数据范围及提示 Data Size & Hint

罪犯之间的怨气值如下面左图所示,右图所示为罪犯的分配方法,市长看到的冲突事件

影响力是3512(由2 号和3 号罪犯引发)。其他任何分法都不会比这个分法更优。

【数据范围】

对于30%的数据有N≤ 15。

对于70%的数据有N≤ 2000,M≤ 50000。

对于100%的数据有N≤ 20000,M≤ 100000。

  

  先谈一下储存方式吧,这个题目肯定不能建二维数组,于是我选择了记录类型。

  这个题目的做法很多,我采取的是并查集的做法,制作了两个数组,一个用来储存他的敌人,也就是肯定不和他在同一个监狱的人,另一个是他的狱友。

  先将怒气值从大到小排序一遍,从大到小进行判断。如果两个人都没有敌人,那么就把对方作为自己的敌人。如果对方已经有敌人了,那么自己和对方的敌人就要成为狱友了。如果两个人是狱友,那么他们的怒气值就是答案了。

  判断两个人是不是狱友,用并查集就可以。因为我们不断规避大的怒气值的出现,一旦出现了一个怒气值无法规避,那么,这个怒气值就是该题目的答案。

  代码风格略渣,不喜勿喷。

 1 type
 2  re=record //记录格式
 3   x:longint;
 4   y:longint;
 5   k:longint;
 6   end;
 7 var
 8  x,y,i,j,n,m,ans,k,t:longint;
 9  a:array[1..100000]of re;
10  b,c:array[1..20000]of longint; //b储存敌人 c储存狱友
11
12 function union(k:longint):longint; //并查集
13 begin
14  if c[k]=k then exit(k)
15  else exit(union(c[k]));
16 end;
17
18 procedure hb(x,y:longint);  //处理两个人信息
19 begin
20  if b[x]=0 then b[x]:=y;
21  if b[y]=0 then b[y]:=x;
22  c[union(y)]:=union(b[x]);
23  c[union(x)]:=union(b[y]);
24 end;
25
26 procedure qsort(h,t:longint);
27 var
28  i,j,x:longint;
29  k:re;
30 begin
31  i:=h;
32  j:=t;
33  x:=a[(h+t) div 2].k;
34  while (i<j) do
35   begin
36   while (a[i].k>x) do inc(i);
37   while (a[j].k<x) do dec(j);
38   if (i<=j) then
39    begin
40    k:=a[i];
41    a[i]:=a[j];
42    a[j]:=k;
43    inc(i);
44    dec(j);
45    end;
46   end;
47  if (i<t) then qsort(i,t);
48  if (h<j) then qsort(h,j);
49 end;
50
51 begin
52  readln(n,m);
53  for i:=1 to n do
54   c[i]:=i;
55  for i:=1 to m do
56   begin
57   readln(x,y,k);
58   a[i].x:=x;
59   a[i].y:=y;
60   a[i].k:=k;
61   end;
62  qsort(1,m);
63  ans:=0;
64  for i:=1  to m do
65   if union(a[i].x)=union(a[i].y) then   //判断两人是否是狱友
66    begin ans:=a[i].k; break; end
67   else
68   hb(a[i].x,a[i].y);
69  writeln(ans);  //如果到最后都没发生冲突,ans就等于0
70 end.

  

时间: 2024-11-08 12:14:51

10 noip 关押罪犯 解题报告的相关文章

10 noip 乌龟棋 解题报告

题目描述 Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一 的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点. …… 1 2 3 4 5 ……N 乌龟棋中M张爬行卡片,分成4种不同的类型(M张卡片中不一定包含所有4种类型 的卡片,见样例),每种类型的卡片上分别标有1.2.3.4四个数字之一,表示使用这种卡 片后,乌龟棋子将向前爬行相应的格子数.游戏中,玩家每次需要从所有的爬行

NOIp 2013 Day2 解题报告

NOIp 2013 Day2 解题报告 1.   积木大赛 每次只要选取连续最大的一段区间即可. 继续归纳可得,答案为∑i=1nmax{0,hi-hi-1} 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable/

NOIp 2013 Day1 解题报告

NOIp 2013 Day1 解题报告 1.   转圈游戏 不难看出答案就是(x+m*10k) mod n 用快速幂算法,复杂度O(log2k) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int n,m,x,

NOIP 关押罪犯

(prison.pas/c/cpp)[问题描述] S 城现有两座监狱,一共关押着 N 名罪犯,编号分别为 1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为 c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为 c 的冲突事件.每年年末,警察局会将本年内监狱中的所有冲突事件按影响力从大到小排成一个列表,然后上报到 S

2017.9.17校内noip模拟赛解题报告

预计分数:100+60+60=220 实际分数:100+60+40=200 除了暴力什么都不会的我..... T1 2017.9.17巧克力棒(chocolate) 巧克力棒(chocolate)Time Limit:1000ms Memory Limit:64MB题目描述LYK 找到了一根巧克力棒,但是这根巧克力棒太长了,LYK 无法一口吞进去.具体地,这根巧克力棒长为 n,它想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后慢慢享用.它打算每次将一根长为 k 的巧克力棒折成两段长为 a

NOIp 2011 Day1 解题报告

1.    铺地毯 送分题…… 枚举给定矩形,判定给定点是否在矩形内.求出标号最大的哪个矩形即可. 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int n,a[10010],b[10010],g

NOIp 2011 Day2 解题报告

1.计算系数 本人比较耿直,没有想到递推的组合数公式,而是用了快速幂求逆元. 复杂度O(Klog10007) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int a,b,k,n,m,mod=10007; 10

9月24日noip模拟赛解题报告

1.校门外的树(tree.c/cpp/pas 128M,1s) Description LSGJ扩建了,于是校门外有了一条长为L的路.路上种了一排的树,每相邻两棵树之间的距离为1,我们可以把马路看成一个数轴,马路的一端在数轴0的位置另一端在数轴L的位置,数轴上的每个整数点都有一棵树. 众所周知,zd是个非常喜欢研究生活中的各种问题的人,zd看到这个现象非常的欣喜,于是他立马就有了一个想法,假如现在要把m个区间内的树全都移走,他想知道最后还剩下多少棵树,由于他刚想出这个问题就被twt拿去一起颓了,

(待解决)LeetCode 10. Regular Expression Matching 解题报告

10. Regular Expression Matching 提交网址: https://leetcode.com/problems/regular-expression-matching/ Total Accepted: 79548 Total Submissions: 361279 Difficulty: Hard Implement regular expression matching with support for '.' and '*'. '.' Matches any sing