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位を求めます
  #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; }