第十場 hdu 6180 Schedule (multiset)/(思惟)

http://acm.hdu.edu.cn/showproblem.php?pid=6180php

 

題目大意:node

已知一些商品製做的開始和結束時間,問在使用最少的機器的前提下機器工做的最少的總時間是多少??
 
解題思路:
 
解法一:
如何求出至少要多少臺機器:
把時間段轉化成一個入點和一個出點,這樣存下2*n個點,以後按座標從小到大給這2*n個點排序,以後O(n)遍歷一遍就好,遇到入點sum++, 遇到出點sum--,遍歷時最大的sum即是答案,算上排序複雜度穩定nlogn(注意:排序時座標相同的點出點優先)
時間求法也很容易:
若是當前sum=5,而ans=4(也就是當前不得不用第5臺機器),那麼記錄下入點的時間,說明第5臺機器在這個時候開始使用,同理,第1,2,6,7,8…臺機器都同樣,那麼結束時間怎麼求?倒過來再遍歷一遍就行了,開始做爲結束,結束做爲開始,這樣二者相減就是每臺機器的工做時間,全加在一塊兒就是答案

解法二:
首先按照產品的開始時間進行排序,而後咱們把結束時間multiset裏面沒若是可以在這個裏面使用upper_bound()找開始時間,若是返回的迭代值和.begin()相同的話,咱們就把結束時間放入容器中。若是不相同的話,就把迭代值減一,開始時間就應該放入連在當前的迭代值後面,而後刪除這個迭代值再在容器中插入結束時間。在處理的時候計算一下總和就能夠了。
 
AC代碼:
解法一:
 1 #include <iostream>
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 using namespace std;
 5 struct node
 6 {
 7     int data,flag;
 8 }a[200005];
 9 int s[100005],e[100005];
10 int cmp(node &a,node &b)
11 {
12     if(a.data<b.data||a.data==b.data&&a.flag<b.flag)
13         return 1;
14     else
15         return 0;
16 }
17 int main()
18 {
19     int n,t;
20     scanf("%d",&t);
21     while(t--)
22     {
23         scanf("%d",&n);
24         int x,y;
25         for(int i=0;i<n;i++)
26         {
27             scanf("%d%d",&x,&y);
28             a[i*2].data=x;
29             a[i*2].flag=1;
30             a[i*2+1].data=y;
31             a[i*2+1].flag=-1;
32         }
33         sort(a,a+n*2,cmp);
34 //        for(int i=0;i<n*2;i++)
35 //            printf("%d %d\n",a[i].data,a[i].flag);
36         long long tmp=0,sum=0;
37         for(int i=0;i<n*2;i++)
38         {
39             sum+=a[i].flag;
40             if(sum>tmp)
41             {
42                 s[sum]=a[i].data;
43                 tmp=sum;
44             }
45             tmp=max(tmp,sum);
46         }
47         sum=0,tmp=0;
48         for(int i=n*2-1;i>=0;i--)
49         {
50             sum-=a[i].flag;
51             if(sum>tmp)
52             {
53                 e[sum]=a[i].data;
54                 tmp=sum;
55             }
56             tmp=max(tmp,sum);
57         }
58         sum=0;
59         for(int i=1;i<=tmp;i++)
60         {
61             //printf("%d %d\n",e[i],s[i]);
62             sum=sum+(e[i]-s[i]);
63         }
64         printf("%lld %lld\n",tmp,sum);
65     }
66     return 0;
67 }
View Code

 

解法二:ios

 1 #include <iostream>
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 typedef long long ll;
 5 struct node
 6 {
 7     int s,e;
 8 }a[100005];
 9 int cmp(const node &a,const node &b)
10 {
11     if(a.s!=b.s)
12     return a.s<b.s;
13     else
14     return a.e<b.e;
15 }
16 int main()
17 {
18     int t,n;
19     scanf("%d",&t);
20     while(t--)
21     {
22         scanf("%d",&n);
23         for(int i=0;i<n;i++)
24         scanf("%d%d",&a[i].s,&a[i].e);
25         multiset<int>mset;
26         multiset<int>::iterator ite;
27         sort(a,a+n,cmp);
28         ll sum=0;
29         int ans=0;
30         mset.clear();
31         for(int i=0;i<n;i++)
32         {
33             ite=mset.upper_bound(a[i].s);
34             if(ite==mset.begin())
35             {
36                 //printf("%d==============\n",i);
37                 ans++;
38                 sum+=a[i].e-a[i].s;
39                 mset.insert(a[i].e);
40             }
41             else
42             {
43                 ite--;
44                 sum+=(a[i].e-*ite);
45                 mset.erase(ite);
46                 mset.insert(a[i].e);
47             }
48         }
49         printf("%d ",ans);
50         printf("%lld\n",sum);
51     }
52     return 0;
53 }
View Code
相關文章
相關標籤/搜索