520ダイヤモンドコンテスト2022の問題解決

520ダイヤモンドコンテスト2022の問題解決

-------------------------------------------------- ----------------------------------
詳しくはこちら>>

OJ問題解決シリーズディレクトリナビゲーション投稿
-------------------------------------- ------ ----------------------------------

順序

520 ダイヤモンド コンテスト 2022 の解答は次のとおりです
。コンテストは毎年 5 月 20 日に開催されます。コンテストの所要時間は 60 分間です。質問は全部で 8 つあります。ポイントは 5 10 10 15 15 20 20 25 です。全体的な難易度は高くなく、入門レベルに近いです 難易度は同じくらいです プログラミングのスピードと能力が試されます
次は問題解決パートです

----------- ---------------------------------- ---------------- ----------------------------------

7-1 520 告白 (5 点)

ここに画像の説明を挿入します

アルゴリズムタグ: 入出力
注: 出力フォーマット

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

int main(){
    
    
	int N;
	cin >> N;
	printf("%d! 520!",N);
	
	return 0;
} 

7-2点ジェリービーンズ(10点)

ここに画像の説明を挿入します

アルゴリズム タグ: if…else… ステートメント
の注意事項: 出力形式

#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 出会い系アプリ(10点)

ここに画像の説明を挿入します

アルゴリズムタグ: ループ
ノート: 順番に出力

#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 奇数に関する方程式(15点)

ここに画像の説明を挿入します

アルゴリズム ラベル: 列挙
注: トピックの方程式によると: 3 n = 1 x + 1 y + 1 z \frac{3}{n}=\frac{1}{x}+\frac{1} {y }+\frac{1}{z}n3=バツ1+y1+z1
移项形得:3 ∗ x ∗ y ∗ z = n ∗ ( x ∗ y + y ∗ z + z ∗ x ) 3*x*y*z=n*(x*y+y*z+z*x )3バツyz=n( ×y+yz+zx ) nn
によるnは既知であるため、 x、y、zx、y、zを列挙するだけで済みます。× z は最小解を見つけることができます。列挙の順序はx − > y − > z x->y->z× >y >z
Notex、 y 、 zx,y,z× zはすべて奇数で、0 < x < y < z ≤ m 0<x<y<z≤m を0<バツ<y<zm最後に
状況を出力することを忘れないでください。 解決策はありません

#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 アイカウント(15点)

ここに画像の説明を挿入します

アルゴリズムラベル: 文字列 + ハッシュ
注: AA を文字列として読み取ってくださいABBBでは、最初に先頭の 0 をすべて削除し、ハッシュ配列 hashT1 を使用して 0 ~ 9 の数をベンチマークとしてカウントし、
判定する必要があるデータA '、B ' A'、B'「、B'、最初に先頭の 0 を削除し、次に 0 ~ 9 の出現数を数え、それを hashT2 に保存し、2 つの配列を比較します。同じ出力がはい、異なる出力がいいえ

#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 あなたが一人なら (20 ポイント)

ここに画像の説明を挿入します

アルゴリズムタグ: シミュレーション
注: 質問の意味に従って、まずRRを決定します。RR = ⌊ N e ⌋ R=\lfloor \frac{N}{e} \rfloorR=eN、次に1 − R 1-R1Rの最大値R + 1 − N R+1-NR+1N、 a[num1] 以上の最初の数値を順番に見つけて、それを出力の最初の数値として記録し、見つからない場合は数値は 0 となり、1 − N 1-N を走査します1N は最大の数値を見つけて、それを出力の 2 番目の数値として記録し、最後に結果を出力します。

#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 新マークシックスくじ(20点)

ここに画像の説明を挿入します

アルゴリズムタグ: 2 次元配列
注: まず、指定された行/列の最小値を決定します ( abs ( a [ x ] [ y ] − A ) ) min(abs(a[x][y]-A))min ( a b s ( a [ x ] [ y ] _ _A)),其中 A A Aを抽選番号とし、上式を満たす全ての座標を行、列の順に出力します。

#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序列(25分)

ここに画像の説明を挿入します
アルゴリズムタグ: ハッシュ
注: シーケンスを 2 つの部分に分割します。≥ 0、< 0 ≥0、<00 <0
(1) 最初にカウント≥ 0 ≥00部分、 ≥ 0 ≥0に遭遇するたびに入力データを走査します。ハッシュバケットの対応する位置の0
の数は +1 (2) 次に、ハッシュバケット内のデータを処理し、ハッシュバケットを大きいものから小さい順に列挙し、数値 t が列挙されるたびに t/ を加算します。 5 ~ 521 のシーケンスで、t/5、t、t/5*2 の 3 つの位置バケットの数値 -1 (3) は、ハッシュ バケット全体が
空になるまでループされ、その後≥ 0 ≥ 0521 の0のシーケンス
この操作手順に従って< 0 < 0<521 0のシーケンスを最後に直接出力できます(ノンインクリメンタルを満たしています)

#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;
} 

結論

最後に、皆さんが毎日幸せな520とACを過ごせることを祈っています。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_41801682/article/details/124896638