520 Diamond Contest 2022 Problemlösung
-------------------------------------------------- ----------------------------------
Für weitere Details>>
Verzeichnis-Navigationsbeitrag der OJ-Problemlösungsserie
------------------------------ ------ ---------------------
Reihenfolge
Hier ist die Lösung zum 520 Diamond Contest 2022.
Der Wettbewerb findet jedes Jahr am 20. Mai statt. Der Wettbewerb dauert 60 Minuten. Es gibt insgesamt 8 Fragen. Die Punkte sind 5 10 10 15 15 20 20 25. Die Der Gesamtschwierigkeitsgrad ist nicht hoch und ähnelt dem Einstiegsniveau. Der Schwierigkeitsgrad ist ungefähr gleich. Es testet die Geschwindigkeit und Fähigkeit des Programmierens. Als
nächstes kommt der Teil zur Problemlösung
----------- ------------------------------------------------- ---------------- ----------------------------------
7-1 520 Geständnis (5 Punkte)
Algorithmus-Tags: Eingabe-/Ausgabehinweise
: Ausgabeformat
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
cin >> N;
printf("%d! 520!",N);
return 0;
}
7–2 Punkte Gummibärchen (10 Punkte)
Algorithmus-Tag: if…else…-Anweisung
verweist auf Hinweis: Ausgabeformat
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,M,K;
cin >> N >> M >> K;
if(M == N*K){
printf("zheng hao mei ren %d!",K);
}else if(M > N*K){
printf("hai sheng %d!",M-N*K);
}else{
printf("hai cha %d!",N*K-M);
}
return 0;
}
7-3 Dating App (10 Punkte)
Algorithmus-Tag: Schleife
Hinweise: Ausgabe in der richtigen Reihenfolge
#include<bits/stdc++.h>
using namespace std;
int main(){
int sex;
int a,b,c,d;
cin >> sex >> a >> b >> c >> d;
int N;
cin >> N;
sex = 1-sex;
for(int i=1;i<=N;i++){
int s,age,h;
cin >> s >> age >> h;
if(sex == s && age>=a && age<=b && h>=c && h<=d){
printf("%d %d %d\n",s,age,h);
}
}
return 0;
}
7-4 Gleichungen über ungerade Zahlen (15 Punkte)
Algorithmus-Tag: Aufzählung
Hinweis: Gemäß der Gleichung in der Frage: 3 n = 1 x + 1 y + 1 z \frac{3}{n}=\frac{1}{x}+\frac{1} {y }+\frac{1}{z}N3=X1+j1+z1
Beispiel: 3 ∗ x ∗ y ∗ z = n ∗ ( x ∗ y + y ∗ z + z ∗ x ) 3*x*y*z=n*(x*y+y*z+z*x )3∗X∗j∗z=N∗( x∗j+j∗z+z∗x )
wegennnn ist bekannt, daher müssen wir nur x, y, zx,y,zaufzählenx ,y ,Die minimale Lösung kann durch z erhalten werden . Die Reihenfolge der Aufzählung solltex − > y − > z x->y->zx −>y −>z
Notex, y , zx,y,zx ,y ,z ist eine ungerade Zahl und erfüllt0 < x < y < z ≤ m 0<x<y<z≤m0<X<j<z≤mDenken Sie abschließend
daran, die Situation auszugeben. Keine Lösung
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main(){
int n,m;
cin >> n >> m;
bool f = false;
for(int x=1;x<=m;x+=2){
for(int y=x+2;y<=m;y+=2){
for(int z=y+2;z<=m;z+=2){
LL ans1 = 3LL*x*y*z;
LL ans2 = 1LL*n*(y*z+z*x+x*y);
if(ans1 == ans2){
cout << x << " " << y << " " << z << endl;
f = true;
break;
}
}
if(f){
break;
}
}
if(f){
break;
}
}
if(!f){
printf("No solution in (%d, %d].",3,m);
}
return 0;
}
7-5 meine Nummer (15 Punkte)
Algorithmusbezeichnung: String + Hash
Hinweis: AA als String lesenA undBBB. Entfernen Sie zuerst alle führenden Nullen und verwenden Sie dann das Hash-Array hashT1, um die Anzahl von 0 bis 9 als Benchmark zu zählen.
Lesen Sie dann die DatenA ′, B ′ A', B' ein,A' ,B′ , entfernen Sie zuerst die führende 0, zählen Sie dann die Anzahl der Vorkommen von 0-9, speichern Sie sie in hashT2, vergleichen Sie die beiden Arrays, die gleiche Ausgabe Ja, unterschiedliche Ausgabe Nein
#include<bits/stdc++.h>
using namespace std;
int hashT1[15];
int hashT2[15];
int main(){
string s1,s2;
cin >> s1 >> s2;
int len1 = s1.size();
int len2 = s2.size();
bool f1 = false;
bool f2 = false;
for(int i=0;i<len1;i++){
if(f1 == false && s1[i] == '0'){
continue;
}else{
f1 = true;
hashT1[s1[i]-'0']++;
}
}
for(int i=0;i<len2;i++){
if(f2 == false && s2[i] == '0'){
continue;
}else{
f2 = true;
hashT1[s2[i]-'0']++;
}
}
while(1){
memset(hashT2,0,sizeof(hashT2));
cin >> s1 >> s2;
len1 = s1.size();
len2 = s2.size();
if(len1 == 1 && len2 == 1 && s1[0] == '0' && s2[0] == '0'){
break;
}
f1 = false;
f2 = false;
for(int i=0;i<len1;i++){
if(f1 == false && s1[i] == '0'){
continue;
}else{
f1 = true;
hashT2[s1[i]-'0']++;
}
}
for(int i=0;i<len2;i++){
if(f2 == false && s2[i] == '0'){
continue;
}else{
f2 = true;
hashT2[s2[i]-'0']++;
}
}
bool f = false;
for(int i=0;i<=9;i++){
if(hashT1[i] == hashT2[i]){
continue;
}else{
f = true;
break;
}
}
if(f){
printf("No\n");
}else{
printf("Yes\n");
}
}
return 0;
}
7-6 Wenn du der Richtige bist (20 Punkte)
Algorithmus-Tag: Simulation
Hinweise: Bestimmen Sie entsprechend der Bedeutung der Frage zunächst den RRR,R = ⌊ N e ⌋ R=\lfloor \frac{N}{e} \rfloorR=⌊eN⌋ , dann zähle1 − R 1-R1−Der Maximalwert in R , speichern Sie den Datensatz als a[num1] und durchlaufen Sie dann R + 1 − N R+1-NR+1−N , suchen Sie in der Reihenfolge nach der ersten Zahl, die größer oder gleich a[num1] ist, zeichnen Sie sie als erste Zahl der Ausgabe auf. Wenn sie nicht gefunden wird, ist die Zahl 0 und durchlaufen Sie dann 1 − N 1-N1−N findet die maximale Zahl, zeichnet sie als zweite Zahl der Ausgabe auf und gibt schließlich das Ergebnis aus
#include<bits/stdc++.h>
using namespace std;
double E = 2.718;
const int maxn = 1e4+5;
int a[maxn];
int main(){
int N;
cin >> N;
for(int i=1;i<=N;i++){
cin >> a[i];
}
double res = 1.0*N/E;
int T = (int)(res);
int site = -1;
int num1 = -1;
int maxm = -1;
for(int i=1;i<=T;i++){
if(a[i]>maxm){
maxm = a[i];
num1 = i;
}
}
int num2 = -1;
maxm = a[num1];
for(int i=T+1;i<=N;i++){
if(a[i]>=maxm){
maxm = a[i];
num2 = i;
break;
}
}
int num3 = -1;
maxm = -1;
for(int i=1;i<=N;i++){
if(a[i]>maxm){
maxm = a[i];
num3 = i;
}
}
if(num2 == -1){
cout << "0 " << num3 << endl;
}else{
cout << num2 << " " << num3 << endl;
}
return 0;
}
7-7 New Mark Six Lotterie (20 Punkte)
Algorithmus-Tag: Zweidimensionales Array
Hinweis: Bestimmen Sie zunächst die Mindestanzahl der angegebenen Zeile/Spalte ( abs ( a [ x ] [ y ] − A ) ) min(abs(a[x][y]-A))m i n ( a b s ( a [ x ] [ y ]−A ) ) , wobeiAAA ist die Lotteriezahl und gibt dann alle Koordinaten aus, die die obige Gleichung erfüllen, in der Reihenfolge zuerst Zeile und dann Spalte.
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;
int a[maxn][maxn];
int main(){
int n,m;
cin >> n >> m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin >> a[i][j];
}
}
int r,c;
cin >> r >> c;
int res;
cin >> res;
int maxm = 1e7;
for(int i=1;i<=m;i++){
if(a[r][i]!=-1 && abs(a[r][i]-res)<maxm){
maxm = abs(a[r][i]-res);
}
}
for(int i=1;i<=n;i++){
if(a[i][c]!=-1 && abs(a[i][c]-res)<maxm){
maxm = abs(a[i][c]-res);
}
}
for(int i=1;i<=m;i++){
if(a[r][i]!=-1 && abs(a[r][i]-res) == maxm){
printf("(%d:%d)\n",r,i);
}
}
for(int i=1;i<=n;i++){
if(a[i][c]!=-1 && i!=r && abs(a[i][c]-res) == maxm){
printf("(%d:%d)\n",i,c);
}
}
return 0;
}
7-8 521 Rangliste (25 Minuten)
Algorithmus-Tag: Hash
Hinweis: Wir teilen die Sequenz in zwei Teile, ≥ 0, < 0 ≥0,<0≥0 ,<0
(1) Zuerst zählen≥ 0 ≥0≥0 -Teil, durchlaufen Sie die Eingabedaten, wann immer≥ 0 ≥0≥Die Zahl 0 ist die entsprechende Position des Hash-Buckets +1
(2). Verarbeiten Sie dann die Daten im Hash-Bucket, zählen Sie die Hash-Buckets in der Reihenfolge von groß nach klein auf und addieren Sie jedes Mal, wenn eine Zahl t aufgezählt wird, t/ 5 bis 521 Fügen Sie in der Sequenz die Zahl -1 zu den drei Positions-Buckets von t/5, t, t/5*2 (3
) hinzu und wiederholen Sie die Schleife, bis der gesamte Hash-Bucket leer ist. Dann erhalten Sie≥ 0 ≥ 0≥521-Sequenz von 0.
Auf die gleiche Weise können Sie diese Schritte ausführen, um< 0 < 0<Die 521-Folge von 0 kann direkt am Ende ausgegeben werden (nicht ansteigend ist erfüllt)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5+5;
int a[maxn];
int hashT1[maxn];
int hashT2[maxn];
int ans[maxn];
int cnt = 0;
int main(){
int N;
cin >> N;
for(int i=1;i<=N;i++){
cin >> a[i];
}
int maxm1 = -1;
for(int i=1;i<=N;i++){
if(a[i]>=0){
hashT1[a[i]]++;
maxm1 = max(maxm1,a[i]);
}
}
for(int j=maxm1;j>=0;){
if(hashT1[j]){
int t = j;
t /= 5;
ans[cnt++] = t;
hashT1[t]--;
t*=2;
hashT1[t]--;
hashT1[j]--;
}else{
j--;
}
}
int maxm2 = -1;
for(int i=1;i<=N;i++){
if(a[i]<0){
hashT2[abs(a[i])]++;
maxm2 = max(maxm2,abs(a[i]));
}
}
for(int j=0;j<=maxm2;){
if(hashT2[j]){
int t = j;
ans[cnt++] = -t;
t*=5;
hashT2[t]--;
t/=5;
t*=2;
hashT2[t]--;
hashT2[j]--;
}else{
j++;
}
}
for(int i=0;i<cnt;i++){
if(i==0){
printf("%d",ans[i]);
}else{
printf(" %d",ans[i]);
}
}
return 0;
}
Abschluss
Abschließend wünsche ich allen jeden Tag einen schönen 520 und AC