题目大意就是说,从1到T区间内,必须保证每个点都有牛在工作,给出每头牛的工作时间,求需用到的最小的牛的数量。
分析:
我开始把一个判断条件写错了:
if(A[0].sta>1||A[n-1].ed<m){cout<<"-1"<<endl;return 0;}
那个ed的条件是错误的,比如说给定数据
3 5
1 2
2 5
3 4
这个数据是可以的,但是我上面的条件会判定为不可以。
AC:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 30000
using namespace std;
typedef long long ll;
ll n,m,ans=1,cnt;
struct node{int sta,ed;
}A[maxn];bool cmp(node a,node b) {if(a.sta!=b.sta) return a.sta<b.sta;else return a.ed>b.ed;
}
int main(){ll res,mark,time;while(~scanf("%lld%lld",&n,&m)){for(int i=0;i<n;i++){scanf("%lld%lld",&A[i].sta,&A[i].ed);}sort(A,A+n,cmp);//排除一定不满足的 if(A[0].sta>1){cout<<"-1"<<endl;continue;}time=A[0].ed;cnt=1;for(int i=1;i<n;i++){if(A[i].sta<=time+1 &&A[i].ed>time){int mark=i;while(A[i].sta<=time+1 &&i<n){if(A[i].ed>A[mark].ed)mark=i;i++;}time=A[mark].ed;cnt++;i=mark;if(time>=m) break;}}if(time>=m)printf("%lld\n",cnt);else printf("-1\n");}return 0;
}
WA了,后面调。
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 2000000
using namespace std;
typedef long long ll;
ll n,m,ans=1;
struct node{int sta,ed;
}A[maxn];
bool cmp(node a,node b) {if(a.sta!=b.sta) return a.sta<b.sta;else return a.ed>b.ed;
}
int main(){scanf("%lld%lld",&n,&m);for(int i=0;i<n;i++){scanf("%lld%lld",&A[i].sta,&A[i].ed);}sort(A,A+n,cmp);if(A[0].sta>1||A[n-1].ed<m){cout<<"-1"<<endl;return 0;}int i=0,j,f,e,pos,flag=false;while(A[i].ed<m){flag=false;// ans++;// e=A[i].ed;if(A[i].ed>=m){break;}// cout<<A[i].ed<<endl;for(j=i+1;j<n;j++){// cout<<A[i].ed<<" "<<A[j].sta<<endl;if(A[j].sta<=A[i].ed){flag=true;continue;}else break;}if(!flag) {printf("-1\n");return 0;}i=j-1;// cout<<"i= "<<i<<endl;ans++;}printf("%lld\n",ans);return 0;
}