라인 범위, 사이트의 범위 선택은 욕심 간격 범위를 설명하기

첫째, 욕심 소개 :

최소 동전

동전의 액면가가 1,2,5,10,20,50,100 칠가지는 지정된 금액을 지불하고 사용하는 동전의 최소 수를 지불하는 방법을 묻는.

이것은 우리가 즉시 동전이 가능한 한 적은을 지불 할 수있을 것입니다까지 동전의 큰 교단을 사용하는 것이 가능한, 생각하는 문제의 매우 루틴입니다. 이것은 "욕심 선택"입니다.

둘째, 욕심 - 라인 범위

이름

기술

 

시간을 계획 많은 활동이있는 학교 예배당 매일 충돌이 조직 일부 활동을 선택해야 할 것이다 이러한 활동을위한 시간이있다. 리우의 역할은 학교 채플 활동을 주선 한 이벤트마다 최대를 준비하는 것입니다. 리우 지금, 그는 가능한 한 많은 활동을 준비하고자하는 계획 활동의 일정을 가지고, 나는 어떻게 준비 물어.

기입

 

첫 번째 행은 정수 번호 m (m <100)은 테스트 데이터 세트 m 거기 나타내고있다.

각 시험의 첫 번째 라인은 정수 n (1 <N <10000)에 테스트 데이터를 N 개의 이벤트가 있다는 것을 나타낸다.

N 라인 다음으로 각 라인은 두 양의 정수 바이, 에이 갖는다 (0 <= 비스무트, 에이 <10000)은 각각 i 번째 이벤트의 시작 및 종료 시간 (BI <= EI)

 

수출

 

각 그룹에 대한 활성 입력의 수는 최대 출력 배치 할 수있다.

샘플 입력 1


1 10
(10) (11)
1 10
(10) (11)
(11) (20)

 

샘플 출력 1

1

 해결 방법 :

당신에게 시간의 활동의 일부를 제공하는 것입니다, 당신은 지정된 시간 범위 내에서 유지해야하는 활동의 대부분 (이벤트의 수는 최대 개최 예정)

이 시간은 짧은 시간, 우리는 각 활동을 수행 할 수 이번에는 첫번째 소형에서 대형에 시간을 종료해야 일부 활동이있다, 활동의 수는 더 비트를 수행 할 수있다.

이 활동 내에서 한 번만 완료 정렬이 후 다음 활동이 끝나기 전에 실시하고, 활동을 제한 할 수 있습니다 종료 시간은 우리가보다 크게 선택한 시간 이후에 시작 할 수 있습니다. 우리는 모든 활동이 너무 오래 시간을 수행하는지 확인하려면, 그래서 같은 시간이 지남에 때 우리는 내림차순으로 시작 시간을 준수해야합니다.

완성 된 정렬 한 후, 활동 0 번 위치는 우리 개최했다. 이후 이벤트 시작 시간이 0보다 큰 활동의 경우 우리는 이벤트 이후에 비해 (이 시간은 숫자 0 이벤트 임) 이벤트 전에 선택한, 다음 이벤트가 개최 될 수 있음을 확인 하였다. 이벤트는 다음이 이벤트와 비교 한 후

예 분석 :

1 10

(10) (11)

(11) (20)

정렬 후 :

1 10

(10) (11)

(11) (20)

호 이벤트와 활동 후 첫 번째 숫자는 상대적으로 0 번이되도록, 0 이벤트 필수. 첫 번째 숫자는 0 번 종료 시간보다 크지 않기 때문에 이벤트 시작 시간. 따라서,이 이벤트가 개최되지 않는다

활동을 비교하는 제 수가 활성보다 두 번째 숫자는 시간 종료 시각 번호 0을 시작한다. 그래서 II 활동을 개최. 그리고 이벤트 이후 두 번째 숫자는 가서 활동을 비교

루프 끝! 출력 응답이

 

코드 :

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 struct node
 6 {
 7     int s;
 8     int e;
 9 } v[10005];
10 bool cmp(node a,node b)
11 {
12     if(a.e==b.e)
13     {
14         return a.s>b.s;
15     }
16     return a.e<b.e;
17 }
18 int main()
19 {
20     int n,t,m,i,x,sum;
21     scanf("%d",&t);
22     while(t--)
23     {
24         scanf("%d",&n);
25         sum=1;
26         for(i=0; i<n; i++)
27         {
28             scanf("%d %d",&v[i].s,&v[i].e);
29         }
30         sort(v,v+n,cmp);
31         x=v[0].e;
32         for(i=1; i<n; i++)
33         {
34             if(v[i].s>x)
35             {
36                 sum++;
37                 x=v[i].e;
38             }
39         }
40         printf("%d\n",sum);
41     }
42     return 0;
43 }
View Code

 

 

三、贪心——区间选点

题目

描述

 

上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?

 

输入

 

多组测试数据。

每组数据先输入一个N,表示有N个闭区间(N≤100)。

接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点。

 

输出

 

输出一个整数,表示最少需要找几个点。

 

输入样例 1

4
1 5
2 4
1 4
2 3
3
1 2
3 4
5 6
1
2 2

输出样例 1

1
3
1

区间选点的话,我们可以以区间头来先排序。也可以先对区间尾进行排序。这里说对区间尾进行排序:

对区间尾进行从小到大排序,如果区间尾相同,我们可以对区间头任意排序,当然也可以不排序。

排序完之后0号区间是肯定要在里面建一个点,之后的区间和它(目前是0号)进行比较。如果之后的区间与这个区间有交集那就不需要添加新的点。否则就必须添加一个点且之后的比较要和这个新的区间进行比较

 样例解析:

4
1 5
2 4
1 4
2 3

排序后:

2 3

1 4

2 4

1 5

第0号区间必选,之后第一号区间1 4和第0号区间有重叠部分,所以不用加点。第二号区间也和第0号区间有重叠部分,所以也不用加点。第三号区间也是如此

所以最后答案是1

 

 代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 using namespace std;
 5 struct node
 6 {
 7     int s,e;
 8 }a[10005];
 9 bool cmp(node a,node b)
10 {
11     if(a.e==b.e)
12     {
13         return a.s>b.s;
14     }
15     return a.e<b.e;
16 }
17 int main()
18 {
19     int n;
20     while(~scanf("%d",&n))
21     {
22         for(int i=0;i<n;i++)
23         {
24             scanf("%d",&a[i].s);
25             scanf("%d",&a[i].e);
26         }
27         sort(a,a+n,cmp);
28         int ans=1,t=0;
29         for(int i=1;i<n;i++)
30         {
31             if(a[i].s>a[t].e)
32             {
33                 ans++;
34                 t=i;
35             }
36         }
37         printf("%d\n",ans);
38     }
39     return 0;
40 }
View Code

 

 

四、区间覆盖

题目

农夫约翰正在指派他的N头牛(1 <= N <= 25,000)中的一些来做谷仓周围的清洁工作。他总是希望有一头奶牛来做清洁工作,他把一天分成了T班(1 <= T <= 1,000,000),第一个是1班,最后一个是T班。
每头奶牛只能在一天中的某个时段进行清洁工作。任何被选来做清洁工作的奶牛将在她的整个休息期间工作。
你的工作是帮助农民John安排一些奶牛轮班,这样(i)每个轮班至少安排一头奶牛,(ii)清洁的奶牛越少越好。如果无法为每个班次分配一头奶牛,请打印-1。

Sample Input

3 10
1 7
3 6
6 10

Sample Output

2

可以先对区间头进行从小到大排序,在区间头一样的情况下我们要对区间尾从大到小排序。因为我们要保证我们选择的每一头牛工作时间尽可能地长

0号牛可以说我们一定会使用它,之后的牛如果和0号牛的工作时间有交集那我们就要从这些有交集的牛上面找出来工作终止时间最大的那个

 

 

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 struct node
 7 {
 8     int s;
 9     int e;
10 } a[25010];
11 bool cmp(node a,node b)
12 {
13     if(a.s==b.s)
14         return a.e>b.e;
15     return a.s<b.s;
16 }
17 int main()
18 {
19     int n,m;
20     scanf("%d%d",&n,&m);
21     for(int i=0;i<n;++i)
22     {
23         scanf("%d%d",&a[i].s,&a[i].e);
24     }
25     sort(a,a+n,cmp);
26     if(a[0].s!=1)
27     {
28         printf("-1\n");
29         return 0;
30     }
31     int ans=1,k=a[0].e,ke=0;
32     for(int i=1;i<n;++i)
33     {
34         if(a[i].s>k+1)
35         {
36             ans++;
37             k=ke;
38         }
39         if(a[i].s<=k+1)
40         {
41             ke=max(ke,a[i].e);
42             if(ke==m)
43             {
44                 k=ke;
45                 ans++;
46                 break;
47             }
48         }
49     }
50     if(k==m) printf("%d\n",ans);
51     else printf("-1\n");
52     return 0;
53 }
View Code

 

추천

출처www.cnblogs.com/kongbursi-2292702937/p/11778750.html