EOJ - 大学生程序设计邀请赛(华东师范大学) F. 丽娃河的狼人传说(贪心)

点击打开题目链接

F. 丽娃河的狼人传说

Time limit per test: 1.0 seconds

Time limit all tests: 1.0 seconds

Memory limit: 256 megabytes

Accept / Submit: 224 / 1759

丽娃河是华师大著名的风景线。但由于学校财政紧缺,丽娃河边的路灯年久失修,一到晚上就会出现走在河边要打着手电的情况,不仅非常不方便,而且影响安全:已经发生了大大小小的事故多起。

方便起见,丽娃河可以看成是从 1 到 n 的一条数轴。为了美观,路灯只能安装在整数点上,每个整数点只能安装一盏路灯。经专业勘测,有 m 个区间特别容易发生事故,所以至少要安装一定数量的路灯,

请问至少还要安装多少路灯。

Input

第一行一个整数 T (1T300),表示测试数据组数。

对于每组数据:

  • 第一行三个整数 n,m,k (1n103,1m103,1kn)

  • 第二行 k 个不同的整数用空格隔开,表示这些位置一开始就有路灯。

  • 接下来 m 行表示约束条件。第 i 行三个整数 li,ri,ti 表示:第 i 个区间 [li,ri] 至少要安装 ti 盏路灯 (1lirin,1tin)

Output

对于每组数据,输出 Case x: y。其中 x 表示测试数据编号(从 1 开始),y 表示至少要安装的路灯数目。如果无解,y 为 1

Examples

input
3
5 1 3
1 3 5
2 3 2
5 2 3
1 3 5
2 3 2
3 5 3
5 2 3
1 3 5
2 3 2
4 5 1
output
Case 1: 1
Case 2: 2
Case 3: 1

Note

因为今天不是满月,所以狼人没有出现。

思路:开始以为事故区间为独立的,不会有重叠的情况,所以没贪心,纯暴WA了以区间右边界从小到大排序,这样才能保证下一个区间安装路灯尽量少

附上AC代码:

#include
#include
#include
#include

using namespace std;
const int maxn = 1e3 + 5;
int T;
int n, m, k;
int have;
int sum;
int kase;

struct edges {
	int l, r, num;
	bool operator <(const edges e)
	{
		return r < e.r;
	}
}edge[maxn];

struct nodes {
	int vis;
}node[maxn];

int main()
{
	ios::sync_with_stdio(false);

	cin >> T;
	while (T--)
	{
		sum = 0;
		memset(edge, 0, sizeof(edge));
		memset(node, 0, sizeof(node));
		cin >> n >> m >> k;
		for (int i = 0; i < k; i++)
		{
			cin >> have;
			node[have].vis = 1;
		}
		for (int i = 0; i < m; i++)
			cin >> edge[i].l >> edge[i].r >> edge[i].num;
		sort(edge, edge + m);
		for (int i = 0; i < m; i++)
		{
			if(edge[i].r-edge[i].l+1 0)
				{
					for (int j = edge[i].r; j >= edge[i].l; j--)
					{
						if (node[j].vis == 0)
						{
							temp--;
							node[i].vis = 1;
							sum++;
						}
						if (temp == 0)
							break;
					}
				}	
			}
		}
		printf("Case %d: %d\n", ++kase, sum);

	}
//	system("pause");
	return 0;
}


你可能感兴趣的:(题库_EOJ,贪心法,ACM)