编程语言
首页 > 编程语言> > 贪心算法解决新冠问题

贪心算法解决新冠问题

作者:互联网

问题描述:如果一个组织里有一个人疑似新冠病人,那么该组织里所有人都将被隔离。假定编号为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. 输入设置
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.查找感染者:

//推荐测试案例:
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<>();    //存储已经感染的组织
	Test(int m,int n){
		q=m;
		w=n;
		a=new int[w][];
		Scanner in=new Scanner(System.in);
		for(int i=0;i<w;i++) {
			int x=in.nextInt();
			a[i]=new int[x];
			for(int j=0;j<x;j++) {  //输入组织中人员编号
				a[i][j]=in.nextInt();
				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]);
				}
			}
		
		}
		}
	int Find() {
		if(hashset1.size()<=0) return 0;
		int count=0;  //设置一个标记,如果该标记为零则代表在此次的遍历中已经没有新的感染者出现,如果有新感染者,则继续执行对下一次的Find()遍历
		for(int i=0;i<w;i++) {
			if(!(hashset1.contains(i))) {  //遍历未被感染的组织
				for(int j=0;j<a[i].length;j++) {	
					if(hashset.contains(a[i][j])) {  //如果此编号在感染者中,该感染者所在组织已被感染
						count++;			//出现新的感染者
						hashset1.add(i);   //该感染者所在组织已被感染,将组织存入被感染组织hashset1中
						for(int k=0;k<a[i].length;k++) {   //存入组织中所有感染者
							hashset.add(a[i][k]);  
						}
						break; //跳出组织,进入下一个
					}
				}
			}
		}
		if(count==0) return hashset.size();  //在此次的遍历中已经没有新的感染者出现,返回感染人数
		else return Find(); //出现新患者,需要检查没被感染的组织中是否还有感染者
	}
}
class Example{
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int m=in.nextInt();  //输入编号
		int n=in.nextInt();  //输入组织号
		Test test=new Test(m,n);
		System.out.println(test.Find());
	}
}
//调试代码
//System.out.print("set ");
//for(int key:hashset)
//System.out.print(key+" ");
//System.out.print('\n'+"set1 ");
//for(int key:hashset1)
//	System.out.print(key+" ");
//System.out.print('\n');

标签:hashset,int,组织,感染,算法,新冠,感染者,hashset1,贪心
来源: https://blog.csdn.net/m0_53703881/article/details/116888273