题目大意:
完全覆盖1-t所需要最小的奶牛数量。。。
解题思路:
首先按开始时间从小到大排序,比如1肯定要在最前面。如果开始时间相同,就把结束时间大的放前面,因为要使奶牛数量最小。比如1-5,1-3,毫无疑问选择1-5。
HDU 2037 今年暑假不AC(与这题异曲同工)
直接上代码
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node{
int st,en;
}a[25005];
bool cmp(node a,node b){
if(a.st==b.st)
return a.en>b.en;
return a.st<b.st;
}
int main()
{
int n,t,i,flag=0;
scanf("%d%d",&n,&t);
for(i=1;i<=n;i++){
scanf("%d%d",&a[i].st,&a[i].en);
}
sort(a+1,a+1+n,cmp);
if(a[1].st>1){
printf("-1\n");
}
else{
int tmp=0,ans=0,temp=0,f=0;
a[n+1].st=9999999;
for(i=1;i<=n;i++){
if(a[i].st<=tmp+1){
if(temp<a[i].en){
temp=a[i].en;
f=1;
}
}
if(a[i+1].st>tmp+1&&f){
ans++;
f=0;
tmp=temp;
}
}
if(tmp<t)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}
#include<algorithm>
using namespace std;
struct node{
int st,en;
}a[25005];
bool cmp(node a,node b){
if(a.st==b.st)
return a.en>b.en;
return a.st<b.st;
}
int main()
{
int n,t,i,flag=0;
scanf("%d%d",&n,&t);
for(i=1;i<=n;i++){
scanf("%d%d",&a[i].st,&a[i].en);
}
sort(a+1,a+1+n,cmp);
if(a[1].st>1){
printf("-1\n");
}
else{
int tmp=0,ans=0,temp=0,f=0;
a[n+1].st=9999999;
for(i=1;i<=n;i++){
if(a[i].st<=tmp+1){
if(temp<a[i].en){
temp=a[i].en;
f=1;
}
}
if(a[i+1].st>tmp+1&&f){
ans++;
f=0;
tmp=temp;
}
}
if(tmp<t)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}
如果有错误请指出,希望对大家有帮助。