Hash-Tabellenbereich für die Zeit

Frage

1048 Münzen finden (25 Min.)
Eva liebt es, Münzen aus dem ganzen Universum zu sammeln, darunter auch von einigen anderen Planeten wie dem Mars. Eines Tages besuchte sie ein Universal-Einkaufszentrum, das alle Arten von Münzen als Zahlungsmittel akzeptieren konnte. Es gab jedoch eine besondere Anforderung an die Zahlung: Für jede Rechnung durfte sie nur genau zwei Münzen verwenden, um den genauen Betrag zu bezahlen. Da sie bis zu 10
5
Münzen bei sich hat, braucht sie unbedingt deine Hilfe. Sie sollen ihr für einen bestimmten Geldbetrag sagen, ob sie zwei Münzen finden kann, um den Betrag zu bezahlen.

Eingabespezifikation:
Jede Eingabedatei enthält einen Testfall. Für jeden Fall enthält die erste Zeile zwei positive Zahlen: N (≤10
5
, die Gesamtzahl der Münzen) und M (≤10
3
, der Geldbetrag, den Eva zahlen muss). Die zweite Zeile enthält N Nennwerte der Münzen, bei denen es sich ausschließlich um positive Zahlen von höchstens 500 handelt. Alle Zahlen in einer Zeile werden durch ein Leerzeichen getrennt.

Ausgabespezifikation:
Geben Sie für jeden Testfall die beiden Nennwerte V
1
​ und
V
2
​ (
durch ein Leerzeichen getrennt) in einer Zeile aus, sodass V
1
​+
V
2
​=
M und V
1 ​≤V
2 ​. Wenn eine solche Lösung nicht eindeutig ist, geben Sie die mit dem kleinsten V 1​ aus . Wenn es keine Lösung gibt, geben Sie stattdessen „Keine Lösung“ aus.






Beispieleingabe 1:
8 15
1 2 8 7 2 4 11 15
Keine Leerzeile am Ende
Beispielausgabe 1:
4 11
Keine Leerzeile am Ende
Beispieleingabe 2:
7 14
1 8 7 2 4 11 15
Keine Leerzeile am Ende end
Beispielausgabe 2:
Keine Lösung

Gedankengang

Verwenden Sie m als Index des Arrays, um die Anzahl der Vorkommen zu zählen.

der Code

Bei der folgenden Methode kommt es bei einem Testfall zu einer Zeitüberschreitung und die Gesamtpunktzahl bleibt bei 23 Punkten hängen:

#include <bits/stdc++.h>
using namespace std;

int main(){
    
    
    int n,m,temp;
    set<int> coins;
    cin>>n>>m;
    for (int i = 0; i < n; ++i) {
    
    
        cin>>temp;
        for (set<int>::iterator i = coins.begin();i!=coins.end();++i) {
    
    
            if(temp+*i==m && temp==*i){
    
    
                cout<<*i<<" "<<temp;
                return 0;
            }

        }
        coins.insert(temp);
    }
    for (set<int>::iterator i = coins.begin();i!=coins.end();++i) {
    
    
        for (set<int>::iterator j = --coins.end();j!=i;--j) {
    
    
            if(*i+*j==m){
    
    
                cout<<*i<<" "<<*j;
                return 0;
            }
        }

    }
    cout<<"No Solution";
    return 0;
}

Code für die volle Punktzahl:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int hashTable[maxn];
int main(){
    
    
    int n,m,temp;
    fill(hashTable,hashTable+maxn,0);
    cin>>n>>m;
    for (int i = 0; i < n; ++i) {
    
    
        cin>>temp;
        hashTable[temp]++;
    }
    for (int j = 1; j < m; ++j) {
    
    
        if(hashTable[j] && hashTable[m-j]){
    
    
            if(j==m-j && hashTable[j]<=1){
    
    
                continue;
            }
            printf("%d %d",j,m-j);
            return 0;
        }
    }
    printf("No Solution");
    return 0;
}

Zusammenfassen

Die Hash-Methode besteht darin, Raum gegen Zeit auszutauschen. Wenn ein Timeout-Phänomen auftritt, können Sie die Verwendung der Hash-Methode in Betracht ziehen.

Supongo que te gusta

Origin blog.csdn.net/qq_19272233/article/details/119422300
Recomendado
Clasificación