codeup смотреть телевизор (C ++)

Название Описание

Летние каникулы, Сяо Мин , наконец , счастливым смотреть телевизор. Но Xiao Ming любимые программы слишком много, он хочет видеть , как большая часть полной программе.
Теперь он положил расписание вещания любимых ТВ - шоу для вас, вы можете помочь ему устроить?

запись

Тестовый вход , включающий в себя множество наборов данных. Первая строка каждого входа представляет собой целое число п (п <= 100), общее количество предпочтительной программы Xiaoming фиг.
Далее п строк, каждая строка ввода двух целых чисел Si и е (1 <= I <= п), обозначает я ю начальную и конечную программы раз, для того , чтобы упростить проблему, каждый раз с положительным целым числом.
При п = 0, входной конец.

экспорт

Для каждого номера ввода и вывода может увидеть полную телевизионную программу.

Ввод пробы  Копировать

12 
1 3 
3 4 
0 7 
3 8 
15 19 
15 20 
10 15 
8 18 
6 12 
5 10 
4 14 
2 9 
0

Пример вывода копирования

5

Проблемные идеи: Это интервал жадной проблема, прежде всего период программы расположено в лучшем случае (то есть, первый запланированное время начала последней программы, если в то же время начала, время окончания запланировано на первых да программу назначения. чтобы гарантировать, что последняя программу просмотра, программа остаются перед самым длинным, коротким интервалом времени также выбрать программу, например, что существует несколько программ, присвоенных больше), то первый период времени в качестве отправной точки (первой период времени должен быть факультативным), пересекающий оставшийся период, текущий конечный программный период времени <= последний период, когда время запуска программы, количество программ может быть запланировано на 1, пока все программы не пройден. (Программа последовательности Вертикальная отличается периода времени после сортировки по времени на оси времени не различимы)

Код выглядит следующим образом:

#include<bits/stdc++.h>
using namespace std;
struct show{
	int start;
	int end;
};
bool cmp(show a,show b){  // 从开始时间排序 
	if(a.start != b.start) return a.start > b.start;  // 若开始时间不同,开始时间晚的排在最前面 (给前面的节目留下更多的时间) 
    else return a.end < b.end;  // 若开始时间相同,结束时间最早的去(即开始到结束时间间隔最短的)排在前面
}
int main(){
	int n;
	while(scanf("%d",&n),n){
		show showes[n];
		for(int i = 0; i < n; i++){
			scanf("%d %d",&showes[i].start,&showes[i].end);
		}
		sort(showes,showes + n,cmp);
		// 排序好的第一个节目是一定可以选择的
		int ans = 1;  // 已经有一个节目可以选择
		int lastStart = showes[0].start;   
		for(int i = 1; i < n; i++){   // 从第二个节目开始判断是否能完整观看 
			if(showes[i].end <= lastStart){   // 当第一个节目的开始时间 大于等于 下一个节目的结束时间时,符合条件 
				ans++;
				lastStart = showes[i].start;
			} 
		}  
		printf("%d\n",ans);
	}
} 

 Такой может сортировать: возрастающий порядок в соответствии с конечным временем, конечное время рано в первом ряду (слева в заднюю части программы больше времени), а затем в порядке убывания в соответствии с временем начала, время начала позже, чем разряд в передней (чтобы обеспечить самый короткий временной интервал); время окончания времени начала программы определяется меньше или равна к следующей программе, если они удовлетворяют условию, то результат увеличивается на единицу.

Код выглядит следующим образом:

#include<bits/stdc++.h> 
using namespace std;
struct show{
	int start;
	int end;
};
bool cmp(show a,show b){
	if(a.end != b.end) return a.end < b.end;  // 升序 
	else return a.start > b.start;   // 降序 
}
int main(){
	int n;
	while(scanf("%d",&n),n){
		show showes[n];
		for(int i = 0; i < n; i++){
			scanf("%d %d",&showes[i].start,&showes[i].end);
		}
		sort(showes,showes + n,cmp);
		// 排序好的第一个节目是一定可以选择的
		int ans = 1;  // 已经有一个节目可以选择
		int lastEnd = showes[0].end;   
		for(int i = 1; i < n; i++){   // 从第二个节目开始判断是否能完整观看 
			if(showes[i].start >= lastEnd){
				ans++;
				lastEnd = showes[i].end;
			}
		}  
		printf("%d\n",ans);
	}
} 

 

Опубликовано 32 оригинальные статьи · вона похвала 2 · Просмотров 1612

рекомендация

отblog.csdn.net/qq_38969094/article/details/104369104
рекомендация