ブルーブリッジカップ練習システムの歴代試験問題


歴代の試験問題に点数がついている
問題記述100は、100=3+69258/714のバンドスコアの形式で表すことができる.100=82+3546/197と表すこともできます.注意特徴:帯分数では、1~9の数字がそれぞれ1回しか現れず(0を含まない).このような帯分数は,100に11種類の表現がある.入力フォーマット標準入力から正の整数N(N<1000*1000)を1つ読み込んだ出力フォーマットプログラムは、この数字がデジタル1~9で繰り返し漏れなく帯分数で表される全種数を出力する.注意:各表示を出力する必要はありません.どれだけの表示方法があるかを統計します.サンプル入力1 100サンプル出力1 11サンプル入力2 105サンプル出力2 6
コード#コード#
import java.util.*;
/*
    ,1-9     ,    、             。
     a,   b,   c
    : ac   N=a+b/c
 */
public class Main {
	public static int N,count=0;
	public static int[] num=new int[10];
	public static boolean flag[]=new boolean[10];
	public static void main(String[] args)
	{
		Scanner scan=new Scanner(System.in);
		N=scan.nextInt();
		scan.close();
		DFS(1);
		System.out.println(count);
	}
	//      
	static int sum(int start,int end)
	{
		int sum=0;
		for(int i=start;i<=end;i++)
		{
			sum=sum*10+num[i];
		}
		return sum;
	}
	//          
	static void judge()
	{
		for(int i=1;i<10;i++)
		{
			int a=sum(1,i);
			if(a>=N) return;
			for(int j=i+(10-i)/2;j<9;j++)//           
			{
				int b=sum(i+1,j);
				int c=sum(j+1,9);
				if(b%c==0&&b>c&&N==a+b/c)
					count++;
			}
		}
	}
	//      1-9  
	static void DFS(int start)
	{
		if(start==10)//            
			judge();
		for(int i=1;i<10;i++)//1-9
		{
			if(flag[i])//        ,   
				continue;
			num[start]=i;
			flag[i]=true;//    true
			DFS(start+1);
			flag[i]=false;//     
		}
	}
}

歴代の試験問題はチェックを切る
問題の説明は下図のように、3 x 3の格子にはいくつかの整数が記入されています.
+--*--+--+
|10* 1|52|
+--****--+
|20|30* 1|
*******--+
| 1| 2| 3|
+--+--+--+

私たちは図の星の線に沿って切って、2つの部分を得て、各部分の数字と60です.この問題の要求は、与えられたm x nの格子の整数を、この2つの領域の数字と等しいように2つの部分に分割できるかどうかをプログラミングして判定することです.
複数の解答がある場合は、左上隅の格子を含む領域に含まれる格子の最小数を出力します.
分割できない場合は0を出力します.入力フォーマットプログラムは、まず2つの整数m nを読み込んでスペースで分割する(m,n<10).表の幅と高さを表します.次はn行で、各行m個の正の整数をスペースで分けます.各整数は10000以下です.出力フォーマットは、すべての解において左上隅を含む分割領域が含む可能性のある最小の格子数を表す整数を出力する.サンプル入力1 3 3 3 10 1 52 20 30 1 1 2 3サンプル出力1 3サンプル入力2 4 3 1 1 1 1 30 80 2 1 1 100サンプル出力2 10
コード#コード#
import java.util.*;
/*
      
 */
public class Main {
	public static int[][] a;
	public static int[][] dir={{1,0},{-1,0},{0,-1},{0,1}};
	public static int m,n,sum=0,min=Integer.MAX_VALUE;
	public static boolean[][] flag;
	public static void main(String[] args)
	{
		Scanner scan=new Scanner(System.in);
		m=scan.nextInt();
		n=scan.nextInt();
		a=new int[n][m];
		flag=new boolean[n][m];
		for(int i=0;isum/2)
			return;
		if(total==sum/2)//          ,                       
		{
			int temp=0;
			for(int i=0;i=n||newy<0||newy>=m||flag[newx][newy]==true)
				continue;
			flag[newx][newy]=true;//    
			DFS(newx,newy,total+a[newx][newy]);
			flag[newx][newy]=false;//     
		}
	}
}

歴代の試験問題でコインをひっくり返す
問題は明ちゃんが「コインをひっくり返す」ゲームをしていることを示しています.テーブルの上にはいくつかのコインが並んでいる.私たちは*で正面を表し、oで裏面を表します(小文字で、ゼロではありません).例えば、「oo*oooo」が左の2つのコインを同時に反転すると、「oooo***oooo」になる可能性があります.現在の明ちゃんの問題は、初期状態と達成する目標状態が既知であれば、毎回隣接する2つのコインを同時に反転するしかありません.では、特定の局面に対して、少なくとも何回反転しますか.隣接する2つのコインをひっくり返すことを一歩操作と呼ぶことを約束します.では、初期状態と達成する目標状態をそれぞれ表すフォーマットの2行などの長い文字列を入力します.各行の長さ<1000出力形式の整数で、最小操作ステップ数を表します.
    1
**********
o****o****
    1
5
    2
*o**o***o***
*o***o**o***
    2
1

コード#コード#
import java.util.*;

public class Main {
	static String s1;
	static String s2;
	static int start=0;
	static int count=0;
	public static void main(String[] args)
	{
		Scanner scan=new Scanner(System.in);
		s1=scan.nextLine();
		s2=scan.nextLine();
		A:while(start

歴代試験問題連番区間数
問題は明ちゃんがここ数日ずっとこのような奇妙で面白い問題を考えています:1~Nのある全配列の中で何個の連番区間がありますか?ここでいう連番区間の定義は、区間[L,R]内のすべての要素(すなわち、この配列のL番目からR番目の要素)がインクリメントソートされて長さR-L+1の「連続」数列が得られる場合に、この区間連番区間と呼ぶ.Nが小さいとき、明ちゃんはすぐに答えを出すことができますが、Nが大きくなると、問題はそんなに簡単ではありません.今、明ちゃんはあなたの助けが必要です.入力フォーマットの最初の行は正の整数N(1<=N<=50000)であり、全配列の規模を表す.2行目はN個の異なる数字Pi(1<=Pi<=N)であり、このN個の数字のある全配列を表す.出力フォーマットは、異なる連番区間の数を表す整数を出力します.サンプル入力1 4 3 2 4 1サンプル出力1 7サンプル入力2 5 3 4 5 1サンプル出力2 9
コード#コード#
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
	public static void main(String[] args) throws IOException
	{
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		int[] a=new int[n];
		for(int i=0;imax) max=a[j];
				if(a[j]

歴代の試験問題で買えなかった数
問題は明ちゃんがキャンディ屋を開いたことだ.彼は工夫を凝らした:フルーツキャンディを4粒1パックと7粒1パックの2種類に包んだ.キャンディは分解して売ってはいけません.子供が砂糖を買いに来たとき、彼はこの2つの包装で組み合わせた.もちろん、砂糖を10粒買うなど、組み合わせられないキャンディもあります.コンピュータでテストしてみてください.このような包装の場合、最大で買えない数は17です.17より大きい数字はすべて4と7で組み合わせることができます.本題の要件は,2つのパッケージの数が既知である場合に,最大で組み合わせられない数字を求めることである.入力フォーマット2つの正の整数は、各包装中の糖の粒数(いずれも1000未満)を表す出力フォーマット1つの正の整数であり、最大で買えない糖数サンプル入力1 4 7サンプル出力1 17サンプル入力2 3 5サンプル出力2 7
コード#コード#
import java.util.Scanner;

public class Main {
	public static void main(String[] args)
	{
		Scanner scan=new Scanner(System.in);
		int a=scan.nextInt();
		int b=scan.nextInt();
		scan.close();
		int max=a*b;
		int[] vis=new int[max+1];
		for(int i=0;i*a=0;i--)
		{
			if(vis[i]==0)
			{
				System.out.print(i);
				break;
			}
		}	
	}
}

歴代の試験問題の幸運数
問題記述の幸運数はポーランドの数学者ウラムが命名した.生成素数に似た「ふるい法」で生成されます.まず1から自然数1,2,3,4,5,6,…1が最初のラッキー数です.私たちは2という数から始めます.すべてのシーケンス番号を2で削除できる項目を削除し、:1_に変更します.3 _ 5 _ 7 _ 9...それらを縮めて、順序を書き直して、1 3 5 7 9....このとき,3は2番目の幸運数であり,3で割り切れるすべてのシーケンス番号位置の数を削除する.注意、シーケンス番号位置ですが、その数自体が3で割り切れるかどうかではありません!!削除されるべきは5,11,17,...このとき7が3番目の幸運数であり,その後削除されるシーケンス番号位置が7で除かれる(19,39,...)最後の残りのシーケンスは,1,3,7,9,13,15,21,25,31,33,37,43,49,51,63,67,69,73,75,79,...入力フォーマットは2つの正の整数m nを入力し,mコード#コード#
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/*
     n     list
     temp           
(       list    ,         ,           ,             )
 */
public class Main {
	public static void main(String[] args) throws IOException
	{
		Scanner scan=new Scanner(System.in);
		int m=scan.nextInt();
		int n=scan.nextInt();
		scan.close();
		List list=new ArrayList<>();
		for(int i=1;i<=n;i+=2)
			list.add(i);
		int index=1;
		List temp;//              
		while(index();
			int delindex=list.get(index);//       (   ),       
			//     0  ,  i     -1  ,       
			for(int i=delindex-1;im&&list.get(i)