第六届决赛 C++ B组 填空题
for (int i = 1; i < 50; i ++)
for (int j = 1; j < 50; j ++)
for (int k = 1; k < 50; k ++)
if(3*i + 7*j + k == 315 && 4*i + 10*j + k == 420)
{
System.out.println(i + j + k);
return;
}
import java.util.*;
public class Main {
static int N = 200;
//完美正方形区间[a][b] 被数组s当中哪个数所占了
static int g[][] = new int[N][N];
//判断s数组当中的正方形有没有被使用
static boolean st[] = new boolean[N];
//判断最终结果的数字有没有被输出过 就只让他输出一遍
static boolean cnt[]= new boolean[N];
static int s[] = {2, 5, 9, 11, 16, 17, 19, 21, 22, 24, 26, 30, 31, 33, 35, 36, 41, 46, 47, 50, 52, 61};
//判断从 (x, y) 起,能否添加边长为 len 的正方形
static boolean judge(int x, int y, int len)
{
// 出界
if(x + len - 1 > 154 || y + len - 1 > 154) return false;
for (int i = x; i < x + len; i ++)
for (int j = y; j < y + len; j ++)
if(g[i][j] > 0) return false; //该点已经被包含在其它正方形内
return true;
}
//从 (x, y) 起,添加边长为 len 的正方形
static void add(int x, int y, int len, int num)
{
for (int i = x; i < x + len; i ++)
for (int j = y; j < y + len; j ++)
g[i][j] = num;
}
static void dfs(int x, int y)
{
// 换行
if(y == 154){
x ++;
y = 1;
}
// 输出答案
if(x == 155)
{
for (int i = 1; i <= 154; i ++)
if(!cnt[g[154][i]])
{
System.out.println(g[154][i]);
cnt[g[154][i]] = true;
}
}
//该点还未被填充
if(g[x][y] == 0)
{
for (int i = 0; i < 22; i ++)
if(!st[i] && judge(x, y, s[i]))
{
st[i] = true;
add(x, y, s[i], s[i]);
dfs(x, y + 1);
//回溯
add(x, y, s[i], 0);
st[i] = false;
}
}
else dfs(x, y + 1);
}
public static void main(String[] args) {
add(1, 1, 47, 47);
add(1, 48, 46, 46);
add(1, 94, 61, 61);
dfs(1, 1);
}
}
第六届决赛 C++ C组 填空题
for (int i = 0; i <= 100; i ++)
for (int j = 0; j <= 100; j ++)
for (int k = 0; k <= 100; k ++)
if(i * 8 + j * 6 + k * 4 == 600 && i*1 + j*3 + k*4 == 280 && i + k + j == 100)
System.out.println(j);
import java.util.*;
public class Main {
static long Reverse(long n) {
int len = String.valueOf(n).length();
long[] A = new long[len];
int i = 0;
while (n > 0) {
A[i++] = n % 10;
n = n / 10;
}
long result = 0;
for (i = 0; i < len; i++)
result = result * 10 + A[i];
return result;
}
public static void main(String[] args) {
for (long i = 0; i <= 200; i++) {
int count = 0;
long a = i;
long b = Reverse(a);
while (a != b) {
a = a + b;
b = Reverse(a);
count++;
if (count > 38) {
System.out.println("i = " + i + ", a = " + a + ", b = " + b);
break;
}
}
}
}
}
第六届决赛 java B组 填空题
import java.util.*;
public class Main {
static boolean check(int i) {
int a = i % 10;
int b = (i % 100) / 10;
int c = i / 100;
if( c > b && b > a){
return true;
}
return false;
}
public static void main(String[] args) {
int res = 0;
for(int i = 100;i<=999;i++) {
if(check(i)) {
res ++;
}
}
System.out.println(res);
}
}
import java.util.*;
public class Main {
/*
注意旋转或镜像后相同的算同一种算法。
先看旋转,且看五个角如果有一种填法为12345,也就同时存在23451/34512/45123/51234都满足判断。
再看镜像,12345和15432、54321和51234、43215和45123、32154和34512、21543和23451都为镜像关系,
因为可以旋转 5 次,每次旋转后还有 一个 镜像 ,所以总的次数 /10
所以最后结果需除以10。
*/
static int[] v = new int[]{1,2,3,4,5,6,8,9,10,12};
static boolean[] st= new boolean[13];
static int[] result = new int[10];
static int sum = 0;
static void dfs(int n) {
if(n == 10) {
int t = result[0]+result[2]+result[5]+result[8];
if(t == result[0]+result[3]+result[6]+result[9]
&& t == result[1]+result[2]+result[3]+result[4]
&& t == result[1]+result[5]+result[7]+result[9]
&& t == result[4]+result[6]+result[7]+result[8])
sum++;
return;
}
for(int i = 0; i < 10; i++) {
if(!st[v[i]]) {
result[n] = v[i]; // 记录当前的数
st[v[i]] =true; // 走过标记
dfs(n+1);
//回溯
st[v[i]] = false; // 走完复位
}
}
}
public static void main(String[] args) {
dfs(0);
System.out.println(sum / 10);
return ;
}
}
第六届决赛 java C组 填空题
与第六届决赛 C++ C组 填空题 相同