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

算法练习题12(马路边种树砍树问题)_第1张图片

算法练习题12(马路边种树砍树问题)_第2张图片

 

 

我:

/*
	第一行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 <

 

 

大佬:

 

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;

 

你可能感兴趣的:(算法练习题,算法)