article Annuaire
- vue d'ensemble
- Sujet un: l'intervalle problème de point sélectionné
- Répétition de titre
- idées de résolution de problèmes
- Un résumé de sujet
- Un titre source
- Sujet deux: problèmes de couverture d'intervalle
- Répétition de titre
- idées de résolution de problèmes
- Sujet deux résumé
- Sujet deux points d'amélioration
- Titre deux Source
vue d'ensemble
algorithme glouton est une méthode couramment utilisée et portable, et sont généralement efficaces. Cet article décrit deux problèmes de base et classique de la cupidité - choix Intervalle Intervalle de problèmes du site et des problèmes de couverture, je l'espère, une certaine compréhension de la lecture.
Sujet un: l'intervalle problème de point sélectionné
Description du titre original
Avec n intervalle fermé [de a_i, b_i] droite numérique. Prendre le moins de points, par exemple qui ont au moins un point (point peut être de différentes sections qui contiennent le même) dans chaque intervalle
CONTRIBUTION
La première ligne d'un nombre entier N (N <= 100)
de 2 ~ N + 1 lignes, respectivement deux nombres entiers a, b (a, b < = 100)
PRODUCTION
Un nombre entier représentant le nombre de points sélectionnés
Exemple d'entrée
2
1 5
4 6
Exemple de sortie
1
Répétition de titre
Signification des questions est relativement simple, étant donné N intervalles, chaque intervalle doit veiller à ce qu'il y ait au moins un point, chaque point sélectionné peut exister dans plusieurs sections, pour tenter de satisfaire cette condition est déterminé combien ces points doivent choisir.
idées de résolution de problèmes
Présentation des idées
Un algorithme glouton classique, algorithme glouton est le problème principal est les règles cupides qui déterminent la règle avide seront en mesure de résoudre facilement le problème.
Le titre de la règle sélectionnée est sélectionnée de manière séquentielle gourmandeLa limite de la plage la plus petiteSéquentiellement considéré, il n'y a pas de point si la limite supérieure est sélectionnée dans la section intervalle, jusqu'à ce que l'intervalle entier est parcouru.
La réalisation effective des idées peut probablement être décrite comme suit: Tout d'
abord, pour maintenir une carte [] tableau pour stocker chaque point doit être ajouté aussi, est initialisé à 0 pour tous les points n'avaient pas été ajoutés, au cours des besoins de visite à ajouter est prêt à partir sur le 1.
Ajouter une variable globale
nombre entier = 0
Ajouté en tant que compteur de points, chaque fois qu'un nouveau point est ajouté, le compteur ++
exécution de graphes de flux intermédiaire gourmand en fonction de la suivante peut être:
Si vous avez accès à la limite de la plage était encore à trouver un point d'ajouter que cette section a besoin d'ajouter un nouveau point est venu, afin de couvrir une plus grande sélection de gamme moins points, comme le choix du plafond de la plage de sélection du site.
À la fin de la traversée de la section entière de la valeur du compteur est la nécessité de choisir le nombre de points.
Un résumé de sujet
Un sujet d'algorithme glouton relativement simple, en se concentrant sur deux aspects de la stratégie gourmande:
1, l'ordre de la gamme traversal - accessible via la gamme supérieure dans l' ordre croissant selon la stratégie, afin d' assurer qu'il n'y aura pas d' intervalle est ignoré, chaque section a au moins une le point.
2, la position du point sélectionné, - quand un intervalle de temps non ajouté au point, ajouter un nouvel emplacement du point sélectionné dans la plage maximale. Dans le processus de traversal vers l' arrière, le plafond de la gamme de politiques pointe chaque ajout d'assurer le point supplémentaire est minime.
Un titre source
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int map[200];
int number=0;
struct time
{
int a;
int b;
bool operator<(const time & ano)const
{
if(b!=ano.b) return b<ano.b;
return a>ano.a;
}
void insert()
{
bool flag=true;
for(int i=a;i<=b;i++)
{
if(map[i]==1)
flag=false;
}
if(flag==true)
{
number++;
map[b]=1;
}
}
};
int main()
{
int all_number=0;
cin>>all_number;
int start=0;
int end=0;
time a[200];
for(int i=0;i<200;i++)
{
map[i]=0;
}
for(int i=0;i<all_number;i++)
{
cin>>start>>end;
a[i].a=start;
a[i].b=end;
}
sort(a,a+all_number);
for(int i=0;i<all_number;i++)
{
a[i].insert();
}
cout<<number<<endl;
return 0;
}
Sujet deux: problèmes de couverture d'intervalle
Description du titre original
Il y a une ligne de nombre n (1 <= n <= 25 000) un intervalle fermé [ai, bi], choisi pour couvrir une gamme aussi faible que segment spécifié [1, t] (1 < = t <= 1000000).
Couvrant le point de l' ensemble, à savoir, (1,2) + (3,4) peut couvrir (1,4).
La sortie impossible -1
CONTRIBUTION
Première ligne: N T et la
seconde rangée N + 1 de la ligne: chaque ligne d'un intervalle fermé.
PRODUCTION
nombre sélectionné d'intervalles, la sortie de l'impossible -1
Exemple d'entrée
3 10
1 7
3 6
6 10
Exemple de sortie
2
Répétition de titre
Le même problème face plus facile à comprendre, compte tenu de la plage d'utilisation, choisir la meilleure stratégie, couvrant la gamme cible.
Cependant, il y a quelques points de données à la note, ou facilement donnés à un moment donné dans le processus de résolution:
1, la limite inférieure de l'intervalle nécessaire pour couvrir 1 est l' intervalle fixé, fermé.
2, des objets à recouvrir entre les sections sont utilisées intervalle fermé, à savoir, tous les points limites et les points intermédiaires sont en mesure de prendre, le sujet décrit une conscience de la situation comparaison error-prone
2 4
1 2
3 4
Description sens du titre est intervalle fermé et exige que couvre toute la question est nécessaire comme suit:
Dans le processus de résolution des problèmes dans l'attention de contrôle cherchent et en considération le point limite, assurez -vous que le code est toujours en cours .
3, le titre est décrit dans une limite inférieure fixe, la limite supérieure est égale à 1, cela est - il possible de couvrir les exigences [1], dans ce cas 1 à délivrer en sortie ne sont pas 0.
idées de résolution de problèmes
Présentation des idées
Comprendre le sujet de certains de l'intervalle de sélection des règles et des fosses peut être déterminé règle gourmande prévue au code de conception.
En premier lieu , la section de traitement d'entrée, peut être effectué sur certains points du prétraitement, la commodité de la section de description sera désignée comme entrée [a, b], être appelés les intervalles cibles couvercles [A, B].
Si le point a > B ou b <B, les données d'entrée est trash inutile, jeté directement, cela peut faire en sorte que les données sont présentes dans une grande quantité de déchets pour réduire le temps de complexité de calcul.
Afin de faciliter l' examen de toutes les sections des données filtrées sont triées par ordre croissant de la taille de la partie supérieure, pour faire en sorte que lors de visites traversal après l' achèvement de la sorte, il doit être au - dessus de la limite de portée plus petit, il peut être facilement déterminée avant Une zone de couverture peut pointer.
Compte tenu de la signification des problèmes pour choisir le moins grand nombre de sections, la longueur L est introduit des mesures sont disponibles pour algorithme glouton.
[A, B] (b> A) pour chaque intervalle disponible
L = bA
Le sujet de la stratégie gourmande peut être déterminée comme: Sélectionner tout intervalle, la longueur utile maximale intervalle de L. Intervalle après une fois sélectionné, résoudra [A, B] dans la résolution de la couverture des problèmes [b + 1, B] problèmes de couverture d' intervalle.
Si L (MAX)> BA, pour les sections facultatives ont été en mesure de couvrir complètement la fourchette cible, les extrémités cupides et renvoie un signe de succès couvert,
si aucune L> 0 intervalle, la preuve de cet intervalle ne peut pas être écrasé, extrémités gourmandes , le défaut de retourner un signe de la couverture.
L' analyse montre la signification des problèmes à chaque fois que vous sélectionnez A est une valeur fixe, de sorte que vous pouvez sélectionner sera converti en L avide avide stratégie de sélection de taille b. besoins de code de conception à noter que les limites supérieure et inférieure de la plage de conversion.
codes encapsulées sont les suivants:
int choose(int begin,int end)
{
int cnt=0;
int j=0;
int flag=0;
for(int i=0;i<room_number;i++)
{
int max_choose=-2e9;
for(j=i;j<room_number && a[j].a<=begin;j++)
{
max_choose=max(max_choose,a[j].b);
}
if(max_choose<begin)
{
cnt=-1;
break;
}
cnt++;
if(max_choose>=end)
{
flag=1;
break;
}
i=j-1;
begin=max_choose+1;
}
if(flag==1)
return cnt;
else
return -1;
}
Sujet deux résumé
Deux questions reflètent une classe avide de sujets définissant des caractéristiques, des questions simples de surface, les problèmes à résoudre très claires, plusieurs ensembles de données à traiter, nécessité de suivre une certaine stratégie à traiter et les données transversales.
algorithme glouton de la stratégie de classification est la solution optimale pour la recherche de partie, au centre de sa stratégie pour résoudre un choix gourmand et la preuve. Choisissez une bonne et raisonnable dans la stratégie gourmande peut garantir la complexité faible temps de principe et de résoudre facilement le problème.
Sujet deux points d'amélioration
Dans le processus d'apprentissage, une compréhension de plusieurs méthodes de prétraitement, l'idée générale est la suivante:
1, les données pré - traitement, pour chaque segment, de l' assiette, en laissant seulement besoin de couvrir la partie efficace entre l'intervalle [A, B], si la garniture après la partie active n'existe pas, la section de suppression
2, la partie restante pour gourmand, la limite supérieure du temps maximum depuis le début de choix a, les situations suivantes:
- Si une limite de portée maximale atteint B, il prouve la couverture se termine et renvoie un signe de réussite.
- Si le nombre de l'intervalle restant est 0 et A! = B, les instructions ne peuvent pas une couverture complète, retourner un signe d'échec.
- Si la plage de nombre restant> 0, mais ne peut pas trouver le début de la section A, le couvercle ne peut pas être décrit, un indicateur de retour a échoué.
- Si le numéro de section> 0 et peut trouver le début de la section A, la limite supérieure de la limite maximale supérieure sélection est b, est convertie en l'intervalle
[b, B] problèmes de couverture d' intervalle, répétez les étapes 1 et 2 pour savoir savoir
Cette approche est théoriquement possible, mais pas encore trouvé une meilleure structure de données, si vous avez des suggestions, s'il vous plaît conseiller généreux.
Titre deux Source
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int room_number=0;
int destination=0;
struct room
{
int a;
int b;
bool operator<(const room& ano)
{
return a<ano.a;
}
}a[25001];
int choose(int begin,int end)
{
int cnt=0;
int j=0;
int flag=0;
for(int i=0;i<room_number;i++)
{
int max_choose=-2e9;
for(j=i;j<room_number && a[j].a<=begin;j++)
{
max_choose=max(max_choose,a[j].b);
}
if(max_choose<begin)
{
cnt=-1;
break;
}
cnt++;
if(max_choose>=end)
{
flag=1;
break;
}
i=j-1;
begin=max_choose+1;
}
if(flag==1)
return cnt;
else
return -1;
}
int main()
{
while(scanf("%d%d",&room_number,&destination)!=EOF)
{
for(int i=0;i<room_number;i++)
{
a[i].a=0;
a[i].b=0;
}
int begin,end=0;
for(int i=0;i<room_number;i++)
{
scanf("%d %d",&begin,&end);
a[i].a=begin;
a[i].b=end;
}
sort(a,a+room_number);
int number=choose(1,destination);
cout<<number<<endl;
}
return 0;
}