贪心求调
查看原帖
贪心求调
1048871
luoziyao楼主2024/5/5 14:54
/*
思路分析 
声明结构体node s表示值班开始时间 e表示值班结束时间 
声明node类型数组a last表示上一次安排值班奶牛的区间 
声明int类型变量 奶牛数n 时段数t 最终值班奶牛数cnt 标记数组book 
输入奶牛数n 时段数t
循环n次
	输入每头奶牛的值班区间
	存入结构体数组中
	标记值班的每个时段
遍历book数组`1~t 循环变量i 
	如果 book[i]没被标记
		输出-1
		结束程序 
将每头奶牛的值班结束的时间从大到小排序
循环直到last.e>=t
	遍历整个结构体数组1~n
		如果当前奶牛的起点满足>=last.s+1且<=last.e+1
			将last赋值为当前奶牛的区间 
			cnt++
			退出循环
输出cnt 
*/ 
#include <bits/stdc++.h>
using namespace std;
struct node
{
	int s,e;
}a[100005],last;
bool cmp(node x,node y)
{
	if(x.e>=y.e)return true;
	return false;
}
int n,t,cnt,book[100005]; 
int main()
{
	last.s=0,last.e=0;
    cin>>n>>t;
    for(int i=1;i<=n;i++)
    {
    	cin>>a[i].s>>a[i].e;
    	for(int j=a[i].s;j<=a[i].e;j++)
    	{
    		book[j]=1;
		}
	}
	for(int i=1;i<=t;i++)
	{
		if(book[i]==0)
		{
			cout<<-1;
			return 0;
		}
	}
	sort(a+1,a+n+1,cmp);
	while(last.e<t)
	{  
		for(int i=1;i<=n;i++)
		{
			if(a[i].s>=last.s+1&&a[i].e<=last.e+1)
			{
				last.s=a[i].s,last.e=a[i].e;
				cnt++;
				break; 
			}
		}
	}
	cout<<cnt;
    return 0;
}
2024/5/5 14:54
加载中...