贪心算法解决新冠问题

问题描述:如果一个组织里有一个人疑似新冠病人,那么该组织里所有人都将被隔离。假定编号为1的人疑似新冠病人,统计将被隔离的总人数(包括编号为1的人)。
输入格式:输入的第一行包含两个整数:n m,其中n为总人数,m为组织数。从第2行开始,接下来的m行表示每个组织的人数和该组织里每个人的编号,每一行的第1个数字k表示组织总人数,接下来的k个数字表示该组织里的每个人的编号。
输出格式:输出一个整数,表示需要隔离的人数。
样例输入:
100 4
2 2 3
5 10 13 11 12 14
2 1 2
2 99 3
样例输出:
4

算法设计:

按照贪心思路,在最开始时将感染初始成员确定后,在检查每个组织时,要使被感染成员尽可能被包括在某个集体(即最大化感染成员),作为下一次遍历的根据。
设置一个哈希表hashset存储已经被感染的人员编号;
另设置一个哈希表hashset1用来存储已经被感染的组织。

  1. 输入设置
  • 为了确保能出现贪心的初始条件,我们设置一个检查点判断是否出现初始感染者G1,若有则该组织被感染,则进行已感染操作
    (把二维数组中的一维数组所在的行标作为组织名存入已感染组织hashset1中,同时将该组织中的所有人员存入已感染者hashset中。)
  • 在找到感染者后,hashset中已经有了成员。为了优化后续查找,我们在对后续输入中进行检查,如果输入中出现感染者就对该组织进行已感染操作
if(hashset.contains(a[i][j])||a[i][j]==1) {  //如果正在输入的成员在hashset中或为1																
					hashset1.add(i);	//将该组织加入hashset1,
					for(int k=0;k<j;k++) {  //将该组织在感染者之前输入的成员加入hashset
						hashset.add(a[i][k]);
						}
				}
				if(hashset1.contains(i)) {  //继续输入之后的成员
					hashset.add(a[i][j]);
				}
			}
		

2.查找感染者:

  • 在输入操作结束后,若某组织感染者,hashset与hashset1中已经有了相应的感染人员和感染组织。

  • 在遍历时如果出现感染组织hashset1中的组织名就跳过该组织(因为在输入数据时已经将其中的组织中的成员加入了hashset中,即已经遍历);

  • 遍历某组织时,如果组织中的某一个成员属于hashset中的成员,将这个组织进行已感染操作,没有则进入下个组织遍历。

  • 设置一个count计数器,记录是否在此次的整体遍历中是否出现了新的感染者,count不为0时再次进行整体遍历,防止有漏网之鱼。

//推荐测试案例:
100 5
2 7 8
2 2 3
2 3 4
2 4 5
2 1 5
  1. 返回hashset中的元素长度即是感染人数。

实例代码:

package 贪心算法;
import java.util.HashSet;
import java.util.Scanner;
public class Test {
   
	int q,w;
	int a[][];   //用数组存储的组织与人数
	HashSet<Integer> hashset=new HashSet<>();  //感染人员编号存储
	HashSet<Integer> hashset1=new HashSet
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值