第7回ブルーブリッジカップ個人コンペティションコンペティション(ソフトウェア)C / C ++ユニバーシティグループA

このブログのBlue Bridgeカップに関連するすべてのコードはjavaを使用して実装されています。
現在のBlue Bridgeカップはプログラムの空白を埋めないため、プログラムは空白を埋めて
質問をスキップします。私の質問のWebサイトはhttp://oj.hzjingma.com/siteです。 /インデックスにはかなりの数のBlue Bridge Cupの質問があります。質問を投稿しない場合は、内部に移動できます。質問がある場合はコメントしてください。他の実際の質問では、最初の質問が徐々に更新され
ます。

试题A:网友年龄 3'
某君新认识一网友。
当问及年龄时,他的网友说:
“我的年龄是个2位数,我比儿子大27,
如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄”
请你计算:网友的年龄一共有多少种可能情况?
提示:30岁就是其中一种可能哦.
请填写表示可能情况的种数。

この質問を直接書くことについて考えることは何もありません

package lan7A;

public class p7000 {
	public static void main(String args[]){
		int count = 0;
		for(int i = 10;i < 100;i++){
			int a = i/10;
			int b = i%10;
			if(i == b*10+a+27){
				System.out.println(i);
				count++;
			}
		}
		System.out.println(count);
	}
}

2番目の質問テスト質問B:誕生日キャンドル5 '

package lan7A;
public class P7001 {
	public static void main(String[] args) {
//		int n = 0;
//		for(int i = 1;i < 100;i++){ // 开始年龄
//			n = 0;
//			for(int j = i;j < 150;j++){
//				n += j;
//				if(n == 236)
					System.out.println(26);
//			}
//		}
	}
}

試験問題C:正方形11 'に記入

图片我就不插了- - 有点麻烦
如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。

この質問は非常に明白です。一見すると、それは検索の形式です。dfsを使用して、最初の行の2番目のグリッドから始めて、数字を1つずつ入力し、3番目の行の4番目を入力して、ans ++
(1)を成功させることができます。visを使用して、この番号が使用されたかどうかを示します
(2)get関数を使用して、この番号がここに入力されているかどうかを確認します。

package lan7A;
public class P7002 {
	static boolean vis[];
	static int ans = 0;
	static int map[][];
	static boolean get(int x,int y,int k){
		for(int i = -1;i <= 1;i++)
			for(int j = -1;j <= 1;j++){
				if(i == 0 && j== 0)
					continue;
				if(x+i>=1 && x+i <=3 && y+j>=1 && y+j <=4)
					if(Math.abs(map[x+i][y+j]-k) == 1)
						return false;
			}
		return true;
	}
	static void dfs(int x,int y){
		if(x==3&&y==4){ // 到最后一个格子了
			ans++;
			return;
		}
		if(y>4){
			dfs(x+1,1);// 已经大于4了说明一行填完了,填下一行
			return;
		}
		for(int i = 0;i < 10;i++){
			if(!vis[i] && get(x,y,i)){
				map[x][y] = i;
				vis[i] = true;
				dfs(x,y+1);
				vis[i] = false;
				map[x][y] = -10; // 注意题意的是否可以填这个数字的意思是跟别的数不连续,所以我们最好弄个负数,跟所有数都不连续,表示没使用过
			}
		}
	}
	public static void main(String args[]){
		vis = new boolean[10];
		map = new int[4][5];
		for(int i = 0;i < 4;i++)
			for(int j = 0;j < 5;j++)
				map[i][j] = -10; // 跟上面dfs中一样的道理啦
		dfs(1,2);
		System.out.println(ans);
	}
}

テスト質問F:冬休みの宿題15 '

这个也有图片。。我就不贴题目了

この質問のアイデアは完全配置です
(1)注意すべきポイントは除算です。整数を使用する場合、それが除算を満たすかどうかを判断できるだけでなく、モジュラー除算が0であることも確認できます。結局、4/3 = 1;
完全配置テンプレート、必要に応じて保管できますブルーブリッジカップは非常に便利です。

package lan7A;
public class P7005 {
	static int a[];
	static int ans;
	static void dfs(int l,int r){
		if(l == r){
			if(a[0]+a[1]==a[2]&&a[3]-a[4]==a[5]&&a[6]*a[7]==a[8]&&a[9]/a[10]==a[11]&&a[9]%a[10]==0){
				ans++;
				return;
			}
		}
		for(int i = l;i <= r;i++){
			int t;
			t = a[l];
			a[l] = a[i];
			a[i] = t;
			dfs(l+1,r);
			t = a[l];
			a[l] = a[i];
			a[i] = t;
		}
	}
	public static void main(String[] args) {
		a = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,13};
		dfs(0,12);
		System.out.println(ans);
	}
}

質問G:切手19 'を切り取ります

如图1,12张连在一起的12生肖的邮票。

现在你要从中剪下5张来,要求必须是连着的。

(仅仅连接一个角不算相连)

比如,图2和图3中,粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法。

请填写表示方案数目的整数。

この質問はテンプレートおよび接続されたブロックテンプレートと組み合わせることができますが、dfsは一度に1つの方向しか選択せず、マイナスグリッドが異なるため、直接dfsを要求することはできません。(ブロガーは怠惰なので、私は本当に写真を入れたくありません)つまり、dfsが3番目の画像を見つけられない場合、dfsは一方向にしか行かないため、この画像は2方向です

package lan7A;
public class P7006 {
	static int ans;
	static boolean map[][];
	static int xx[] = new int[]{1,-1,0,0};
	static int yy[] = new int[]{0,0,-1,1};
	static Node node[] = new Node[12];
	static int b[] = new int[5];
	static Node key[] = new Node[5]; // 保存每次选的组合
	static void dfs(int x,int y,int count){
		if(x<0 || x>=3 || y<0 || y>=4)
			return;
		if(map[x][y])
			return;
		map[x][y] = true;
		for(int i = 0;i < 4;i++){
			int dx = x+xx[i];
			int dy = y+yy[i];
			dfs(dx,dy,count);
		}
	}
	static void search(int m,int n){ // 组合模板
		for(int i = m;i <= n;i++){
			b[m-1] = i-1;
			if(m > 1)
				search(m-1,i-1);
			else{
				for(int j = 0;j < 3;j++) // 初始化地图 便于求联通块数量
					for(int k = 0;k < 4;k++)
						map[j][k] = true;
				for(int j = 0;j < 5;j++){ // 将我们选出来的点存到key中
					key[j] = new Node();
					key[j].x = node[b[j]].x;
					key[j].y = node[b[j]].y;
					map[key[j].x][key[j].y] = false;
				}
				int count = 0;
				for(int k = 0;k < 5;k++) // 判断我们组合的5个点有几个连通块
					if(!map[key[k].x][key[k].y])
						 dfs(key[k].x,key[k].y,++count);
				if(count == 1){ // 等于1说明只有1个连通块
//					for(int k = 0;k < 5;k++)
//						System.out.print(key[k].x+" "+key[k].y+" ");
//					System.out.println();
					ans++;
				}
			}
		}
	}
	public static void main(String[] args) {
		map = new boolean[4][4];
		int k = 0;
		for(int i = 0;i < 3;i++)
			for(int j = 0;j < 4;j++){
				node[k] = new Node();
				node[k].x = i;
				node[k++].y = j;
				map[i][j] = false;
			}
		search(5,12); // 12个格子中任取5个
		System.out.println(ans);
	}
}
class Node{
	int x;
	int y;
}

テスト質問H:4乗和21 '

四平方和定理,又称为拉格朗日定理:

每个正整数都可以表示为至多4个正整数的平方和。

如果把0包括进去,就正好可以表示为4个数的平方和。

对于一个给定的正整数,可能存在多种平方和的表示法。

要求你对44个数排序:

0 <= a <= b <= c <= d 

并对所有的可能表示法按 a,b,c,da,b,c,d 为联合主键升序排列,最后输出第一个表示法

もちろん、直接的な暴力は、暴力の前にNを最適化する方法を見つけます。最大値は5 * 1e6と見なすことができます。直接の4重ループは確かに受け入れられません
(1)二乗の合計であるため、sqrt(N )結構です
(2)4の平方和、3を列挙するだけです。最後の平方和を直接Nで減算して平方根を求め、平方和が等しいかどうかを判断します。

package lan7A;
import java.util.*;
public class P7007 {
	static void get(int x){
		for(int h1 = 0;h1*h1<=x;h1++){
			for(int h2 = h1;h2*h2<=x;h2++){
				for(int h3 = h2;h3*h3<=x;h3++){
					int h4 = (int)Math.sqrt(x-h1*h1-h2*h2-h3*h3);
						if(h1*h1+h2*h2+h3*h3+h4*h4 == x){
							System.out.println(h1+" "+h2+" "+h3+" "+h4);
							return;
					}
				}
			}
		}
	}
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int n =sc.nextInt();
		get(n);
	}
}

元の記事を32件公開 賞賛5件 訪問862件

おすすめ

転載: blog.csdn.net/shizhuba/article/details/104885666