列表

详情


NC50162. 种树

描述

某条街被划为 n 条路段,这 n 条路段依次编号为。每个路段最多可以种一棵树。现在居民们给出了 h 组建议,每组建议包含三个整数 b,e,t,表示居民希望在路段 b 到 e 之间至少要种t棵树。这些建议所给路段的区间可以交叉。请问:如果要满足所有居民的建议,至少要种多少棵树。

输入描述

第一行为n,表示路段数。
第二行为h,表示建议数。
下面 h 行描述一条建议:b,e,t,用一个空格分隔。

输出描述

输出只有一个数,为满足所有居民的建议,所需要种树的最少数量。

示例1

输入:

9
4
1 4 2
4 6 2
8 9 2
3 5 2

输出:

5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 67ms, 内存消耗: 484K, 提交时间: 2022-08-10 16:08:08

#include<bits/stdc++.h>
using namespace std;
int n,h;
struct edu{ 
	int b,e,t;
}
a[5010];
bool use[30005];
int ans=0,k;
bool cmp(edu x,edu y)
{
	return x.e<y.e;
}
int main()
{
	cin>>n>>h;  
	for(int i=1;i<=h;i++)cin>>a[i].b>>a[i].e>>a[i].t;  
	sort(a+1,a+h+1,cmp);
	for(int i=1;i<=h;i++)  
	{
		k=0;
		for(int j=a[i].b;j<=a[i].e;j++)if(use[j])k++;
		if(k>=a[i].t)continue;  
		for(int j=a[i].e;j>=a[i].b;j--)
		{
			if(!use[j]){
				use[j]=true; 
				k++;
				ans++;
				if(k==a[i].t)break;
			}
		}
	}
	cout<<ans; 
	return 0;
}

C++(clang++11) 解法, 执行用时: 34ms, 内存消耗: 648K, 提交时间: 2020-10-22 08:37:42

#include<iostream>
#include<algorithm>
using namespace std;
int n,h,used[40000],k,ans;
struct node{
	int b,e,d;
}a[5001];
bool cmp(node a,node b)
{
	return a.e<b.e;
}
int main()
{
	cin>>n>>h;
	for(int i=1;i<=h;i++)
	cin>>a[i].b>>a[i].e>>a[i].d;
	sort(a+1,a+h+1,cmp);
	for(int i=1;i<=h;i++)
	{
		k=0;
		for(int j=a[i].b;j<=a[i].e;j++)
		if(used[j])k++;
		if(k>=a[i].d)continue;
		for(int j=a[i].e;j>=a[i].b;j--)
		{if(!used[j]){
			used[j]=1;
			k++;
			ans++;
			if(k==a[i].d)break;}
		}
	}
	cout<<ans;
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 58ms, 内存消耗: 732K, 提交时间: 2020-06-08 18:47:18

#include<bits/stdc++.h>
using namespace std;
const int N=3e4+10;
struct node
{
	int s,e,t;
}a[N];
int n,h,vis[N],ans;
bool cmp(node a,node b)
{
	return a.e<b.e;
}
int main()
{
	scanf("%d%d",&n,&h);
	for(int i=0;i<h;i++)
	scanf("%d%d%d",&a[i].s,&a[i].e,&a[i].t);
	sort(a,a+h,cmp);
	for(int i=0;i<h;i++)
	{
		int s=0;
		for(int j=a[i].s;j<=a[i].e&&s<a[i].t;j++)
		{
			if(vis[j])s++;
		}
		for(int j=a[i].e;j>=a[i].s&&s<a[i].t;j--)
		if(!vis[j]){
			s++;ans++;vis[j]=1;
		}
	}
	printf("%d\n",ans);
}

Python3 解法, 执行用时: 1243ms, 内存消耗: 6236K, 提交时间: 2022-10-14 12:00:46

import sys
n = int(sys.stdin.readline().strip())
h = int(sys.stdin.readline().strip())
l = []
for i in range(h):
    l.append(list(map(int,sys.stdin.readline().strip().split(' '))))
l.sort(key=lambda x:x[1])
tree = [0]*n
for a in l:
    current = sum(tree[a[0]-1:a[1]])
    need = a[2]-current
    for i in range(a[1]-1,a[0]-2,-1):
        if need<=0:
            break
        else:
            if tree[i]==0:
                tree[i]=1
                need -= 1
print(sum(tree))

上一题