2019南海区青少年情報オリンピック(小学校グループA)
スコア:460ポイント、ファーストクラス500 (私はまだ上手すぎる)
要約:それは主に質問5の残念です(わずか20ポイント)
次回は、それを行う前に、自分の考えを明確にし、特定の方法について考える必要があります
(貪欲になるために何年にもわたって5つまたは6つの質問があったようです)
A.正方行列の印刷
タイトルの説明
次の正方行列は非常に規則的で、曲がりくねった正方形と呼ばれます。たとえば、3×3:
1 2 3
6 5 4
7 8 9
辺の長さが与えられたら、対応する曲がりくねった正方行列を出力します。
入力形式
整数n。これは、n×nの曲がりくねった正方行列、1≤n≤100を出力することを意味します。
出力形式は
n行で、各行はスペースで区切られたn個の整数です。
試料
サンプル入力1
4
サンプル出力1
1 2 3 4
5 6 7 8
9 10 11 12
16 15 14 13
直接的な暴力、詳細なし。
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
if(i%2==1)
{
for(int j=(i-1)*n+1;j<=i*n;j++)
cout<<j<<" ";
cout<<endl;
}
if(i%2==0)
{
for(int j=i*n;j>=(i-1)*n+1;j--)
cout<<j<<" ";
cout<<endl;
}
}
return 0;
}
B.分数の減算
タイトルの説明
私たちは皆、そのような分数計算を知っています。2つの分数を引いた結果を計算するようにプログラムしてください。
入力形式
最初の行、2つの整数aとbは、分数abab、1≤a<b≤10000を表します。
2行目では、2つの整数cとdが分数cdcdを表し、1≤c<d≤10000です。
データを入力して、計算結果が正であることを確認します。
出力形式
結果を表す2つの整数。
注意:計算結果の端数はポイントを提供します。
サンプル
サンプル入力14
7
13
サンプル出力15
21
結果のオファーポイントに注意してください
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
using namespace std;
int z1,m1,z2,m2,a1,a2,k;
int main()
{
cin>>z1>>m1>>z2>>m2;
for(int i=1;i<=m1;i++)
{
if(i*m2%m1==0)
k=i*m2;
} //防止int炸(不加也没有关系)
z1=z1*(k/m1);
z2=z2*(k/m2);
a1=z1-z2;
a2=k;
int i=2;
while(i<=a1)
{
if(a1%i==0&&a2%i==0)
a1=a1/i,a2=a2/i;
else
i++;
}//约分
cout<<a1<<" "<<a2;
return 0;
}
C.後方
トピックの説明
先生は黒板にN個の正の整数の行を書きました。先生は生徒が右から左に数字を暗唱して読み、合計を見つける能力をテストしたいと考えていました。たとえば、次の3つの整数が書き込まれます:123 4560。結果は次のとおりです:06 + 54 + 321 = 381
入力形式
最初の行、整数n、1≤n≤100。
2行目には、n個の正の整数があり、それぞれが1,000,000を超えていません。
出力形式
整数。
サンプル
サンプル入力1
3
123 45 60
サンプル出力1
381
文字列の方が便利です
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<cmath>//pow函数
using namespace std;
int n;
long long ans;
string s;
int main()
{
cin>>n;
for(int e=1;e<=n;e++)
{
cin>>s;
for(int i=s.size()-1;i>=0;i--)
{
int d=s[i]-'0';
ans=ans+pow(10,i)*d;
}
}
cout<<ans;
return 0;
}
D.セットの違い
タイトルの説明
AとBの2つのシリーズの番号があります。Aには表示されるがBには表示されない番号は、セットAとセットBの違い:ABと呼ばれます。例:A = {1,4,5,2,6}、B = {5,3,2,7}、次にAB = {1,4,6}。
ここで、2つのセットAとBを与え、ABにいくつの数があるかを調べます。
入力形式
最初の行、2つの整数naとnbは、セットAとセットBにある整数の数を示します。1≤na、nb≤10000。
2行目では、na個の異なる正の整数がセットAの数値を表しており、各正の整数は10000を超えていません。
3行目では、nb個の異なる正の整数がセットBの数値を表しており、各正の整数は10,000を超えません。
出力形式
整数、ABに含まれる数値の数。
試料
サンプル入力1
5 4
5 2 4 8 7
3 7 6 2
出力例1
3
データ範囲とヒント
サンプルの説明:
AB = {5,4,8}。
配列統計はタイムアウトせず、詳細もありません
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
int n,a[10005],b[10005],f,ans,m;
int main()
{
cin>>n;
cin>>m;
for(int i=1;i<=n;i++)
{
cin>>f;
a[f]++;
ans++;
}
for(int i=1;i<=m;i++)
{
cin>>f;
if(a[f]==1)
ans--;
}
cout<<ans;
return 0;
}
E.表現可能な数字
タイトル説明
左から右にN個の整数が並んでいます。ある数がその前の2つの数の合計に等しい場合、この数は表現可能な数であると言われます。与えられたシーケンスのいくつの数を表すことができるか尋ねてください。
入力形式
最初の行である整数Nは、シーケンス内に存在する整数の数を示します(1≤N≤10000)。
2行目には、N個の正の整数があり、それぞれが10,000を超えません。
出力形式
整数、表現可能な数値がいくつあるか。
試料
サンプル入力1
8
5 2 2 3 4 8 7 16
のサンプル出力1
3
データ範囲とヒント
サンプルの説明:
4 = 2 + 2; 8 = 5 + 3; 7 = 3 +4。
Oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooもそれはそうだ、私はそれがあまりにも複雑だと思うので、多くの詳細があり、怒っ
元のコード:
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
int n,a[10005],f,ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>f;
a[f]=i;
}//这样只要一有重复的,数组就会被覆盖掉
for(int i=1;i<=10000;i++)
{
for(int j=1;j<=10000;j++)
{
if(a[i]!=0&&a[j]!=0&&a[i+j]!=0&&a[i+j]!=-1)
{
if(a[i]<=a[i+j]&&a[j]<=a[i+j])
{
ans++;
a[i+j]=-1;
}
}
}
}//当时的逻辑好清奇,我到现在也想不通当时为什么要这样写……
cout<<ans;
return 0;
}
ACコード:
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
int n,a[10005],c[20005],ans;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i-1;j++)//往前找,保证是前面两个
{
c[a[i]+a[j]]=1;//防止出现多个加起来相同的数
}
ans=ans+c[a[i]];//如果有相同的数字,那它也会++,妙哉
}//我觉得有点类似素数筛法
cout<<ans;
return 0;
}
とても怒っています〜
F.積み上げ羅漢
タイトル説明
農場のN頭の牛は、羅漢を積み重ねるゲームをするのが好きです。つまり、数頭の牛、1頭の牛の後に1頭の牛が柱の形で立っています。ただし、牛の強さは異なります。Ciの値を使用して、i番目の牛に最大で何頭の牛が立つことができるかを示し、少なくとも柱の形で何頭の牛が立つことができるかを尋ねます。
入力形式:
最初の行、1つの整数N、牛の数を示し、1≤N≤1000。
2行目のN個の正の整数Ciは、これらの牛の力、0≤Ci≤1000を表します。
出力形式:
整数。これは、少なくとも複数の「羅漢」を意味します。
サンプル
入力サンプル:
5
0 2 1 2 2
出力サンプル:
2
データ範囲とリマインダー
サンプルの説明:
1頭目、3頭目、2頭目の牛は上から下
に積み重ねることができ、4頭目と5頭目の牛は積み重ねることができます。
#実際、それは貪欲です。私も試験中にそれを考えましたが、方法は複雑すぎます(正しく行うのは良いことですが、問題は正しくありません!)。
大きなものから小さなものまで、基本的な考え方。(基本的には考えられますが)
でも同じならどうやってまとめたらいいのでしょうか?
入れたら少し遅れて負けてしまいます入れ
ないと最後に答えないと間違ってしまいます(試験に巻き込まれました)
だから、それを続けるという問題について考えないでください、ただ小さいものから大きいものまで始めて、上から下に積み重ねて、あなたができるところにそれを置いて、そしてあなたができることは何でもしてください:D(このトリックは偉大な神によって考えられました、それはとても強力です、崇拝)
ACコード:
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
int n,f,ans,c[10005],k,d;
int main()
{
//freopen("638.in","r",stdin);
//freopen("638.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>f;
c[f]++;
}
while(k<n)
{
d=0;//要承受多少只
ans++;
for(int i=0;i<=1000;)//注意0
{
if(c[i]!=0&&i>=d)
{
c[i]--;//考虑多只奶牛f相同
k++;
d++;
}
else
i++;
}
}
cout<<ans;
return 0;
}
ε=(´ο` *)))今回のテストはとても悪いです