**题目大意:
已知一些商品制作的开始和结束时间,问在使用最少的机器的前提下机器工作的最少的总时间是多少??**
参考http://www.cnblogs.com/wang-ya-wei/p/7428077.html
没有想到可以这样做。。。其实应该分析好复杂度,能够有的方法大概就是贪心了。
这个地方用的记录begin和 end时间的方法自己是没有用过。。。不会
int n,k;
struct Node{
int add;
int pos;
bool friend operator<(Node a,Node b){
if(a.pos==b.pos)return a.add<b.add;
return a.pos<b.pos;
}
}san[N<<1];
int ans;
int ll[N],rr[N];
int be[N],en[N];
int main(){
int T;sf("%d",&T);
while(T--){
LL tot=0;
ans=0;
int sum=0;
int n;sf("%d",&n);
int cnt=0;
rep(i,1,n){sf("%d%d",&ll[i],&rr[i]);san[++cnt].pos=ll[i];san[cnt].add=1;san[++cnt].pos=rr[i];san[cnt].add=-1;}
sort(san+1,san+1+cnt);
for(int i=1;i<=cnt;++i){
sum+=san[i].add;
if(sum>ans){ be[++ans]=san[i].pos;}
san[i].add=-san[i].add;
}
int tmp=ans;ans=0;sum=0;
for(int i=cnt;i>=1;--i){
sum+=san[i].add;
if(sum>ans){en[++ans]=san[i].pos;}
}
for(int i=1;i<=ans;++i)tot+=en[i]-be[i];
pf("%d %lld\n",tmp,tot);
}
}
也有用multiset 的
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node
{
int s,e;
}a[100005];
int cmp(const node &a,const node &b)
{
if(a.s!=b.s)
return a.s<b.s;
else
return a.e<b.e;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&a[i].s,&a[i].e);
multiset<int>mset;
multiset<int>::iterator ite;
sort(a,a+n,cmp);
ll sum=0;
int ans=0;
mset.clear();
for(int i=0;i<n;i++)
{
ite=mset.upper_bound(a[i].s);
if(ite==mset.begin())
{
//printf("%d==============\n",i);
ans++;
sum+=a[i].e-a[i].s;
mset.insert(a[i].e);
}
else
{
ite--;
sum+=(a[i].e-*ite);
mset.erase(ite);
mset.insert(a[i].e);
}
}
printf("%d ",ans);
printf("%lld\n",sum);
}
return 0;
}