CSP-devoirs Semaine3 problema cupidité --- deux questions pointent portée Quelques problèmes et les problèmes de couverture d'intervalle (C ++)

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:

Created with Raphaël 2.2.0 对全部区间按照区间 上限值升序排序 访问区间中每个点 是否被添加过 map[]==1 该区间添加过点 访问下一个区间 yes no

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:
Insérer ici l'image DescriptionDans 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;
}
Publié 17 articles originaux · louange gagné 2 · Vues 1662

Je suppose que tu aimes

Origine blog.csdn.net/qq_43942251/article/details/104807616
conseillé
Classement