算法练习题12(马路边种树砍树问题)

 

 

我:

/*
	第一行L和N表示的是校园原来有L+1棵树, 并接下来有N次砍树或者种树的操作 。0表示砍树 1 表示种树
	以下N行表示砍树和种树的标记和范围。每行3个整数。
	L(1<=L<=10000) 和N (1<=N<=100)
	输出格式共2行,第一行校门外留下的树苗数量 ,第二行种上又被拔掉的树苗数目。
	*/

	int ar[10005] = { 0 };//-1表示初始值(树)   0 被砍掉(空)  1表示种上(树苗)  10 种树上又被砍的
	int L, N;
	cin >>L >> N;
	for (int i = 0; i < L; i++)
	{
		ar[i] = -1;//初始化原始的值
	}
	
	for (int i = 0; i < N; i++)
	{
		int flag, start, end;
		cin >> flag >> start >> end;
		if (flag == 0) {//砍树
			for (int j = start; j <= end; j++)
			{
				if (ar[j] == 1) {//表示种树又被拔掉的数目
					ar[j] = 10;
				}
				else {
					ar[j] = 0;
				}
				
				
			}
		}
		else {//种树
			for (int k = start; k < end; k++)
			{
				if (ar[k] == 0||ar[k]==10) {//只有被砍掉的才要种
					ar[k] = 1;
				}

			}
		
		}
	}

	int smCount=0,kdSmCount=0;
	for (int i = 0; i < L; i++)
	{
		if (ar[i] == 1) {
			smCount++;
		}
		else if (ar[i] == 10) {
			kdSmCount++;
		}
	}
	cout << smCount <<endl << kdSmCount<<endl;

 

 

大佬:

 

bool opt;
	int L, N;
	int n1, n2;  // 种树/砍树 的起点和终点
	int ans1 = 0, ans2 = 0;  // 最后幸存树苗 种上又被砍掉的树苗
	int flag[10005] = {0};
			// 1 --> 当前点是大树
			// 2 --> 当前点是树苗
			// 0 --> 当前点树被砍掉
	cin >> L >> N;
	for(int i = 0; i <= L; i++) {
		flag[i] = 1;   // 起始时,每个点都有一颗大树
	}

	for(int i = 1; i <= N; i++) {
		cin >> opt >> n1 >> n2;
		if(opt == 0) {
			// 砍树
			for(int j = n1; j <= n2; j++) {
				if(flag[j] == 2) {
					ans2++;    // 统计当前被砍掉的树苗
				}
				flag[j] = 0;
			}
		} else {
			// 种树
			for(int j = n1; j <= n2; j++) {
				if(flag[j] == 0) {
					flag[j] = 2;    // 种上树苗
				}
			}
		}
	}
	
	for(int i = 0; i <= L; i++) {
		if(flag[i] == 2) {
			ans1++;
		}
	}
	
	cout << ans1 << "\n" << ans2 << endl;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Prim算法是一种贪心算法,用于求解最小生成树问题。在Java中实现Prim算法,可以通过以下步骤输出树边权重: 1. 定义一个二维数组graph表示图的邻接矩阵,其中graph[i][j]表示节点i和节点j之间的边权重。 2. 定义一个一维数组dist表示每个节点到最小生成树的距离,初始值为正无穷大。 3. 定义一个一维数组parent表示每个节点在最小生成树中的父节点,初始值为-1。 4. 选择一个起始节点start,将dist[start]设置为。 5. 重复以下步骤,直到所有节点都被加入最小生成树: a. 找到当前距离最小的节点min,将其加入最小生成树。 b. 更新min的邻居节点的距离和父节点,如果新的距离小于原来的距离,则更新dist和parent数组。 6. 输出最小生成树的边权重,可以通过遍历parent数组来得到每个节点在最小生成树中的父节点,从而得到每条边的权重。 下面是一个简单的Java代码实现: ```java public class PrimAlgorithm { public static void prim(int[][] graph) { int n = graph.length; int[] dist = new int[n]; int[] parent = new int[n]; boolean[] visited = new boolean[n]; Arrays.fill(dist, Integer.MAX_VALUE); Arrays.fill(parent, -1); dist[] = ; for (int i = ; i < n; i++) { int min = findMin(dist, visited); visited[min] = true; for (int j = ; j < n; j++) { if (!visited[j] && graph[min][j] < dist[j]) { dist[j] = graph[min][j]; parent[j] = min; } } } for (int i = 1; i < n; i++) { System.out.println(parent[i] + " - " + i + ": " + graph[i][parent[i]]); } } private static int findMin(int[] dist, boolean[] visited) { int min = -1; for (int i = ; i < dist.length; i++) { if (!visited[i] && (min == -1 || dist[i] < dist[min])) { min = i; } } return min; } } ``` 在上面的代码中,findMin方法用于找到当前距离最小的节点,prim方法用于实现Prim算法,输出最小生成树的边权重。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值