2019年ブルーブリッジカップ省試合B組問題解(A,B,C,D,F,G)
4616 ワード
心得:料理は原罪、不注意は罪に加罪!
A:チームを組む
一人に5つの点数があって、一人に20つの点数を見てはいけません...答え490
B:年号文字列
2019=2* 26* 26+25*26+17;
答えBYQ
C:数列評価
,1,1,1,3,5,9は20190324位を求めます
D:数の分解
2019を3つの異なる正の整数の和に分解し、正の整数ごとに数字2と4を含まないことを要求するのは、全部で何種類の異なる分解方法がありますか?なお、3つの整数を交換する順序は、同じ方法とみなされ、例えば1000+1001+18と1001+1000+18は同じ方法とみなされる.暴力列挙
F:特別数の和
明ちゃんは、数桁に2、0、1、9が含まれている数字に興味を持っています(プリアンブル0は含まれていません).1から40の数字には、1、2、9、10から32、39、40の28が含まれています.彼らの合計は574です.すみません、1からnの中で、このような数の和はいくらですか?
暴力を列挙する.
G:完全二叉木の重み値
N個のノードを含む完全な二叉木を1本与え、木の上の各ノードには重み値があり、上から下、左から右の順にA 1,A 2,・・A Nである.今、明ちゃんは同じ深さのノードの重み値を加算し、どの深さのノードの重み値の和が最大なのか知りたい.複数の深さの重み値と同じ最大値がある場合は、最小の深さを出力します.
深さは同じように加算され、その深さの最後の1つになると最大重み値かどうかを考慮します.現在位置の次の位置の深さを記録して判断します.
A:チームを組む
一人に5つの点数があって、一人に20つの点数を見てはいけません...答え490
B:年号文字列
2019=2* 26* 26+25*26+17;
答えBYQ
C:数列評価
,1,1,1,3,5,9は20190324位を求めます
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int a[3]={1,1,1};
int main()
{
for(int i=4;i<=20190324;i++)
a[i%3]=(a[0]+a[1]+a[2])%10000;
printf("%d
",a[20190324%3]);
return 0;
}
D:数の分解
2019を3つの異なる正の整数の和に分解し、正の整数ごとに数字2と4を含まないことを要求するのは、全部で何種類の異なる分解方法がありますか?なお、3つの整数を交換する順序は、同じ方法とみなされ、例えば1000+1001+18と1001+1000+18は同じ方法とみなされる.暴力列挙
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int main()
{
int ans=0;
for(int i=1;i<=694;i++)
{
if(i%10!=2 && (i/10)%10!=2 && (i/100)%10!=2 && i%10!=4 && (i/10)%10!=4 && (i/100)%10!=4)
{
for(int j=i+1;j<=1010;j++)
{
if(j%10!=2 && (j/10)%10!=2 && (j/100)%10!=2 && (j/1000)%10!=2 && j%10!=4 && (j/10)%10!=4 && (j/100)%10!=4 && (j/1000)%10!=4)
{
for(int k=j+1;k<=2016;k++)
{
if(k%10!=2 && (k/10)%10!=2 && (k/100)%10!=2 && (k/1000)%10!=2 && k%10!=4 && (k/10)%10!=4 && (k/100)%10!=4 && (k/1000)%10!=4)
{
if( (i+j+k)==2019 )
ans++;
}
}
}
}
}
}
printf("%d
",ans);
return 0;
}
F:特別数の和
明ちゃんは、数桁に2、0、1、9が含まれている数字に興味を持っています(プリアンブル0は含まれていません).1から40の数字には、1、2、9、10から32、39、40の28が含まれています.彼らの合計は574です.すみません、1からnの中で、このような数の和はいくらですか?
暴力を列挙する.
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int a[100005];
int main()
{
int n;
LL ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
if(i%10==2 || (i/10)%10==2 || (i/100)%10==2 || (i/1000)%10==2)
ans+=i;
else if(i%10==1 || (i/10)%10==1 || (i/100)%10==1 || (i/1000)%10==1)
ans+=i;
else if(i%10==9 || (i/10)%10==9 || (i/100)%10==9 || (i/1000)%10==9)
ans+=i;
else if(i>=1 && i<10 && (i%10==0))
ans+=i;
else if(i>=10 && i<100 && (i%10==0 || (i/10)%10==0))
ans+=i;
else if(i>=100 && i<1000 && (i%10==0 || (i/10)%10==0 || (i/100)%10==0))
ans+=i;
else if(i>=1000 && i<=1000 && (i%10==0 || (i/10)%10==0 || (i/100)%10==0 || (i/1000)%10==0 || (i/10000)%10==0))
ans+=i;
}
printf("%lld
",ans);
return 0;
}
G:完全二叉木の重み値
N個のノードを含む完全な二叉木を1本与え、木の上の各ノードには重み値があり、上から下、左から右の順にA 1,A 2,・・A Nである.今、明ちゃんは同じ深さのノードの重み値を加算し、どの深さのノードの重み値の和が最大なのか知りたい.複数の深さの重み値と同じ最大値がある場合は、最小の深さを出力します.
深さは同じように加算され、その深さの最後の1つになると最大重み値かどうかを考慮します.現在位置の次の位置の深さを記録して判断します.
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
int a[100005];
int main()
{
int n,x,nx,ans,maxx=-100000000,num;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
x=log2(i)+1;
nx=log2(i+1)+1;
if(x==nx && i!=n)
ans+=a[i];
else if(i==n)
{
ans+=a[i];
if(ans>maxx)
{
maxx=ans;
num=x;
}
}
else
{
ans+=a[i];
if(ans>maxx)
{
maxx=ans;
num=x;
}
ans=0;
}
}
printf("%d
",num);
return 0;
}