啊,最近在上课,但我没有放弃学习,看了视频和自己以前的博客,今天做了国赛题 ,加油!
一、最大乘积
描述
把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。
比如:
984672351 = 345619872
987513462 = 341875962
9 * 87146325 = 784316925
…
符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?
注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。
(只提交乘积,不要提交整个算式)
输入
没有输入。
输出
package day1;
//考察数列的全排列
public class t2 {
static int max=-1;
public static boolean jud(int i){//用于判断是否只含1-9,且仅一次
int num[]=new int [9];
boolean flag=true;
while(i!=0){
int t=i%10;
if(t==0){
flag=false;
return flag;
}else{
num[t-1]++;
i=i/10;
}
}
// for(int j=0;j<9;j++){
// System.out.print(num[j]+" ");
// }
for(int j=0;j<9;j++){
if(num[j]!=1){
flag=false;
break;
}
}
return flag;
}
public static void qpl(int[]num,int i){//全排列
if(i==num.length){
// int nu=0;
// for(int j=0;j<num.length;j++){
// nu+=(int) (num[j]*Math.pow(10,j));
// }
// if(jud(nu)){
// System.out.println(nu);
// }
cf(num);
}else{
for(int t=i;t<num.length;t++){
swap(num, i, t);
qpl(num, i+1);
swap(num, i, t);
}
}
}
public static void cf(int []num){//选择位置,进行乘法
for(int i=1;i<=8;i++){
int a=0,b=0;//a代表前半部分,b代表后半部分
for(int j=0;j<i;j++){
b+=(int) (num[j]*Math.pow(10,j));
}
for(int j=i;j<num.length;j++){
a+=(int) (num[j]*Math.pow(10,j-i));
}
long res=a*b;
// System.out.println(a+"*"+b+"*"+res);
int a1=(int) (res/Math.pow(10, 9));
int b1=(int) (res/Math.pow(10, 8));
if(a1==0&&b1!=0){
// if((int)res/Math.pow(10, 9)==0&&(int)res/Math.pow(10, 8)!=0){//保证是9位数
if(jud((int)res)){
System.out.println(a+"!"+b+"!"+res);
if(res>max){
max=(int) res;
}
}
}
}
}
public static void swap(int []num,int i,int j){
int t=num[i];
num[i]=num[j];
num[j]=t;
}
public static void main(String[] args) {
System.out.println(jud(784316925));
// int []num={1,2,3,4,5,6,7,8,9};
int []num={9,5,2,3,6,4,1,7,8};
cf(num);
// qpl(num, 0);
int res=123456789;
int a=(int) (res/Math.pow(10, 9));
System.out.println(a);
// System.out.println(max);
System.out.println(839542176);
}
}
二、控制台输出一个整数,表示那个最大的积,不要填写任何多余的内容。
对于某个串,比如:“1234”,求它的所有全排列`
`。
并且要求这些全排列一定要按照字母的升序排列。
对于“1234”,应该输出(一共4!=24行):
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
下面是实现程序,请仔细分析程序逻辑,并填写划线部分缺少的代码。
package day1;
//轮换前k个,再递归处理
import java.util.*;
public class t3
{
static void permu(char[] data, int cur){
if(cur==data.length-1){
System.out.println(new String(data));
return;
}
for(int i=cur; i<data.length; i++){
char tmp = data[i];
for(int j=i-1; j>=cur; j--) data[j+1] = data[j];
data[cur] = tmp;
permu(data, cur+1);
tmp = data[cur];
// data[cur]=data[i];
for(int j=cur; j<i; j++) data[j] = data[j+1];
data[i] = tmp;
}
}
static void permu(String x){
permu(x.toCharArray(),0);
}
public static void main(String[] args){
permu("12345");
}
}
三、整理玩具
描述
小明有一套玩具,一共包含NxM个部件。这些部件摆放在一个包含NxM个小格子的玩具盒中,每个小格子中恰好摆放一个部件。
每一个部件上标记有一个0~9的整数,有可能有多个部件标记相同的整数。
小明对玩具的摆放有特殊的要求:标记相同整数的部件必须摆在一起,组成一个矩形形状。
如以下摆放是满足要求的:
00022
00033
44444
12244
12244
12233
01234
56789
以下摆放不满足要求:
11122
11122
33311
111111
122221
122221
111111
11122
11113
33333
给出一种摆放方式,请你判断是否符合小明的要求。
输入
输入包含多组数据。
第一行包含一个整数T,代表数据组数。 (1 <= T <= 10) 以下包含T组数据。
每组数据第一行包含两个整数N和M。 (1 <= N, M <= 10)
以下包含N行M列的矩阵,代表摆放方式。
输出
对于每组数据,输出YES或者NO代表是否符合小明的要求。
输入样例 1
3
3 5
00022
00033
44444
3 5
11122
11122
33311
2 5
01234
56789
package day1;
import java.util.HashSet;
import java.util.Scanner;
public class t4_2 {
static HashSet<Integer> hs;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int tsum;
tsum=sc.nextInt();
for(int ti=0;ti<tsum;ti++){
int n=sc.nextInt();
int m=sc.nextInt();
int [][]num=new int[n][m];
hs=new HashSet<Integer>();
for(int i=0;i<n;i++){
String temp=sc.next();
char []tcs=temp.toCharArray();
for(int j=0;j<m;j++){
int t=Integer.parseInt(String.valueOf(tcs[j]));
num[i][j]=t;
}
}
int flag=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(num[i][j]!=-1&&!hs.contains(num[i][j])){
int t=num[i][j];
if(jud(num, num[i][j], i, j)){
hs.add(t);
continue;
}else{
flag=0;break;
}
}
if(flag==0){
break;
}
}
if(flag==0){
break;
}
}
if(flag==0){
System.out.println("NO");
}else{
int f2=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(num[i][j]!=-1){
f2=0;
}
}
}
if(f2==0){
System.out.println("NO");
}else{
System.out.println("YES");
}
}
}
}
//判断数字i构成的是不是一个矩形
public static boolean jud(int [][]num,int i,int x,int y){
int endx=-1,endy=-1;
for(int j=x;j<num.length;j++){
if(num[j][y]==i){
endx=j;
}
}
for(int j=y;j<num[0].length;j++){
if(num[x][j]==i){
endy=j;
}
}
boolean flag=true;
for(int m=x;m<=endx;m++){
for(int n=y;n<=endy;n++){
// System.out.println(x+"@@@"+y);
// System.out.println(m+"***"+n);
// System.out.println(endx+"&&&"+endy);
if(num[m][n]==i){
num[m][n]=-1;
}else{
flag=false;
}
}
}
// for(int i1=0;i1<num.length;i1++){
// for(int j=0;j<num[0].length;j++){
// System.out.print(num[i1][j]+" ");
// }
// System.out.println();
//
// }
// System.out.println();
return flag;
}
}
还有个错误的代码,但是参考意义也很大(错误是指 不符合本题)
package day1;
import java.util.HashSet;
import java.util.Scanner;
//考察连通性(连着就可以用,不适合本题,错误的答案,仅针对于实例)
public class t4 {
static int [][]step={{-1,0},{1,0},{0,1},{0,-1}};
static HashSet<Integer> hs;
public static void main(String[] args) {
int n,m;
int sum;
Scanner sc=new Scanner(System.in);
sum=sc.nextInt();
for(int tsum=0;tsum<sum;tsum++){
hs=new HashSet<Integer>();
n=sc.nextInt();
m=sc.nextInt();
int [][]num=new int[n][m];
for(int i=0;i<n;i++){
String temp=sc.next();
char []tcs=temp.toCharArray();
for(int j=0;j<m;j++){
int t=Integer.parseInt(String.valueOf(tcs[j]));
num[i][j]=t;
}
}
// lt(num, 0, 0, 0);
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// System.out.print(num[i][j]+" ");
// }
// System.out.println();
// }
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(num[i][j]!=-1&&!hs.contains(num[i][j])){
hs.add(num[i][j]);
lt(num, num[i][j], i, j);
// System.out.println(num[i][j]);
}
}
}
int flag=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
// System.out.print(num[i][j]+" ");
if(num[i][j]!=-1){
flag=0;
}
}
// System.out.println();
}
if(flag==1){
System.out.println("YES");
}else{
System.out.println("NO");
}
}
}
public static void lt(int [][]num,int i,int x,int y){//判断连通, 数组,数字
num[x][y]=-1;
if(x<0||x>num.length-1||y<0||y>num[0].length-1){
return;
}
for(int j=0;j<4;j++){
int tx=x+step[j][0];
int ty=y+step[j][1];
if(tx<0||tx>num.length-1||ty<0||ty>num[0].length-1){
continue;
}else{
if(num[tx][ty]==i){
num[tx][ty]=-1;
lt(num, i, tx, ty);
}
}
}
}
}