答案:3129
import java.util.*;
public class Main {
public static void main(String args[]) {
for(int i=1;i<=10000;i++)
{
boolean flag=true;
int t=i;
for(int j=0;j<5;j++)
{
if((t+1)%5!=0)
{
flag=false;
break;
}
t=(t+1)*4/5;
if(j==4 && (t>2000 || t<1000))
{
flag=false;
break;
}
}
if(flag)
{
System.out.println(i);
}
}
}
}
2.标题:六角幻方
答案:9 6 5 2 16
思路:DFS+剪枝
import java.util.*;
public class Main {
static int b[]={0,1,2,3,4,5,6,7,8,9,10,11,12,14,16,17,18,19};
static int a[]=new int[17];
static boolean vis[]=new boolean[18];
public static void dfs(int cur)
{
if (cur == 5)
{
if (28+a[0] != a[1]+a[2]+a[3]+a[4]) return;
}
if (cur == 6)
{
if (28+a[0] != 15+a[1]+a[5]) return;
}
if (cur == 10)
{
if (28+a[0] != a[5]+a[6]+a[7]+a[8]+a[9]) return;
}
if (cur == 11)
{
if (28+a[0] != 13+a[2]+a[6]+a[10]) return;
}
if (cur == 14)
{
if (28+a[0] != a[10]+a[11]+a[12]+a[13]) return;
}
if (cur == 15)
{
if (28+a[0] != a[0]+a[3]+a[7]+a[11]+a[14]) return;
if (28+a[0] != a[5]+a[10]+a[14]) return;
}
if (cur == 16)
{
if (28+a[0] != a[4]+a[8]+a[12]+a[15]) return;
if (28+a[0] != a[1]+a[6]+a[11]+a[15]) return;
}
if (cur == 17)
{
if (28+a[0] != a[9]+a[13]+a[16]) return;
if (28+a[0] != 15+a[2]+a[7]+a[12]+a[16]) return;
System.out.println(a[5]+" "+a[6]+" "+a[7]+" "+a[8]+" "+a[9]);
}
for (int i = 1; i <= 17; i++)
{
if (!vis[i])
{
vis[i] = true;
a[cur] = b[i];
dfs(cur+1);
vis[i] = false;
}
}
}
public static void main(String args[]) {
dfs(0);
}
}
3.标题:格子放鸡蛋
下面的程序解决了这个问题,请仔细分析程序逻辑,推断划线处缺少的代码。
public class A
{
static int max = 0;
static int T = 0;
static final int N = 6;
// 只能在(r,c) 以及其右,其下放置
static void f(int[][] da, int r, int c)
{
if(r>=N){
int n = count(da);
if(n>max) {
max = n;
T = 0;
}
if(n==max) T++;
return;
}
//计算一下步放哪
int r_next = r;
int c_next = c + 1;
if(c_next>=N){
c_next = 0;
r_next++;
}
if(____________________){ // 填空位置
da[r][c] = 1;
f(da, r_next, c_next);
}
da[r][c] = 0;
f(da, r_next, c_next);
}
static int count(int[][] da)
{
int n = 0;
for(int i=0; im) m = n;
//该列
n=0;
for(int i=0; im) m = n;
//右斜线
n=0;
for(int i=0; i=N || c+i>=N) break;
if(da[r+i][c+i]==1) n++;
}
if(n>m) m = n;
//左斜线
n=0;
for(int i=0; i=N) break;
if(da[r-i][c+i]==1) n++;
}
for(int i=1; i=N || c-i<0) break;
if(da[r+i][c-i]==1) n++;
}
if(n > m) m = n;
return m;
}
public static void main(String[] args)
{
int[][] da = new int[N][N];
f(da, 0, 0);
System.out.println(max);
System.out.println(T);
}
}
注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字或已有符号)。
答案:spy(da, r, c) < 2
4.标题:排列序数
如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
abcd 0
abdc 1
acbd 2
acdb 3
adbc 4
adcb 5
bacd 6
badc 7
bcad 8
bcda 9
bdac 10
bdca 11
cabd 12
cadb 13
cbad 14
cbda 15
cdab 16
cdba 17
...
现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?
【输入格式】
一行,一个串。
【输出格式】
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。
例如:
输入:
bdca
程序应该输出:
11
再例如:
输入:
cedab
程序应该输出:
70
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
思路:全排,但是部分数据顺序好像有点问题,调整中。
import java.util.*;
public class Main {
static String str;
static int index=0;
public static boolean check(char a[])
{
boolean flag=true;
for(int i=0;i
5.标题:幂一矩阵
注意:主类的名字必须是:Main,否则按无效代码处理。
思路:https://blog.csdn.net/qq_26358509/article/details/71056436 这篇文章说的很详细。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
//创建索引数组num[n]
int[] num = new int[n];
for(int i = 0;icount){
max = max*count/gcd(max,count);
}else{
max = max*count/gcd(count,max);
}
}
}
//输出最终结果
System.out.println(max);
in.close();
}
private static long gcd(long max, long count) {
//辗转相除法求最大公约数
if(max%count==0){
return count;
}
return gcd(count,max%count);
}
}
6.
注意:主类的名字必须是:Main,否则按无效代码处理。
思路:先用floyd算下各点之间的关系,暂时先给个暴力枚举的。。。
import java.util.*;
public class Main {
static int n,m,k;
static int inf=99999999;
static int map[][];
static int res=0;
static int temp[][];
public static int count()
{
int count=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(map[i][j]>=0 && map[i][j]0 && map[k][j]>0)
if(map[i][j]>=map[i][k] && map[i][k]<=map[k][j]) {
map[i][j] = map[i][k];
}
}
public static void reset()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
map[i][j]=temp[i][j];
}
}
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
n=in.nextInt();
m=in.nextInt();
k=in.nextInt();
map=new int[n+1][n+1];
temp=new int[n+1][n+1];
for(int i=1;i<=n;i++) {
for (int j = 1; j <= n; j++) {
if (i == j)
map[i][j] = 0;
else
map[i][j] = inf;
}
}
for(int i=0;i