题目搜集于各位前辈,侵删。
第一题
import java.util.Scanner;
//签到题,直接用pow(x,1.0/3.0)好像有问题,要是卡时间就用这个
public class c1701 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int t=0;t<T;t++) {
int n = sc.nextInt();
int count = 0;
for(double i = 1;i<=n;i++) {
int k = (int)Math.sqrt(i);
if(k*k == i) {
for(double j = 1;j<=k;j++) {
if(j*j*j == i) {
count++;
break;
}
}
}
}
System.out.println(count);
}
sc.close();
}
}
第二题
import java.util.Scanner;
//难度不高,就是太麻烦
public class c1702 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] arr = new int[n+1];
for(int i = 1;i<=n;i++) {
arr[i] = sc.nextInt();
}
for(int i = 0;i<m;i++) {
int k = sc.nextInt();
int l = sc.nextInt();
int r = sc.nextInt();
if(k==1) {
for(int j = 0;j<=(r-l)/2;j++) {
int temp = arr[l+j];
arr[l+j] = arr[r-j];
arr[r-j] = temp;
}
}else if(k==2) {
int len = sc.nextInt();
for(int j = 0;j<len;j++) {
int temp = arr[l+j];
arr[l+j] = arr[r+j];
arr[r+j] = temp;
}
}else if(k==3) {
int x = sc.nextInt();
for(int j = l;j<=r;j++) {
arr[j] = x;
}
}else if(k==4) {
for(int j = l;j<=r;j++) {
for(int p = j+1;p<=r;p++) {
if(arr[j]>arr[p]) {
int temp = arr[j];
arr[j] = arr[p];
arr[p] = temp;
}
}
}
}else {
int sum = 0;
for(int j = l;j<=r;j++) {
sum+=arr[j];
}
System.out.println(sum);
}
// for(int j = 1;j<=n;j++) {
// System.out.print(arr[j]+"---");
// }
// System.out.println();
}
}
}
第三题
import java.util.Scanner;
/*
*先把树建立起来,然后再后序遍历
*/
public class c1703 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String nlr = sc.next();
String lnr = sc.next();
node root = new node(nlr.charAt(0)-'0');
root.value = nlr.charAt(0)-'0';
build(nlr,lnr,root);
String ans = backSearch(root);
System.out.println(ans);
}
static class node{
int value;
node left=null;
node right=null;
public node(int value) {
super();
this.value = value;
}
}
static void build(String nlr,String lnr,node root) {
if(nlr.length()==0) {
return ;
}
int pos = 0;//找root在中序中的位置
for(int i = 0;i<lnr.length();i++) {
if(lnr.charAt(i)-'0'==root.value) {
pos = i;
break;
}
}
String leftnlr = nlr.substring(1,1+pos);
String leftlnr = lnr.substring(0,pos);
if(leftnlr.length()!=0) {
node leftroot = new node(leftnlr.charAt(0)-'0');
root.left = leftroot;
build(leftnlr,leftlnr,leftroot);
}
String rightnlr = nlr.substring(pos+1);
String rightlnr = lnr.substring(pos+1);
if(rightnlr.length()!=0) {
node rightroot = new node(rightnlr.charAt(0)-'0');
root.right = rightroot;
build(rightnlr,rightlnr,rightroot);
}
}
static String backSearch(node root) {
String l = "";
String r = "";
if(root.left!=null) {
l = backSearch(root.left);
}
if(root.right!=null) {
r = backSearch(root.right);
}
return l+r+String.valueOf(root.value);
}
}
第四题
import java.util.Scanner;
/*
* 找肯定是递归找,
* 从四周扫描0?
* 然后呢?中间的怎么办?
* 中间的也递归?试试吧
*/
public class c1704 {
static int countS = 0;
static int count8 = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int t=0;t<T;t++) {
countS = 0;
count8 = 0;
int m = sc.nextInt();
int n = sc.nextInt();
int[][] arr = new int[m+1][n+1];//m行n列,留出0
for(int i = 1;i<=m;i++) {
for(int j = 1;j<=n;j++) {
arr[i][j] = sc.nextInt();
}
}
count(arr,1,1,m,n);
System.out.println(countS+" "+count8);
}
sc.close();
}
static void count(int[][] arr,int m1,int n1,int m,int n) {
if(m-m1<2||n-n1<1) {
return ;
}
int up = 0;
int down = Integer.MAX_VALUE;
int left = 0;
int right = Integer.MAX_VALUE;
for(int i = 1;i<=m;i++) {
int flag = 0;
for(int j = 1;j<=n;j++) {
if(arr[i][j]==1) {
up = i;
flag = 1;
break;
}
}
if(flag == 1) {
break;
}
}
for(int i = m;i>=1;i--) {
int flag = 0;
for(int j = 1;j<=n;j++) {
if(arr[i][j]==1) {
down = i;
flag = 1;
break;
}
}
if(flag == 1) {
break;
}
}
for(int i = 1;i<=n;i++) {
int flag = 0;
for(int j = 1;j<=m;j++) {
if(arr[j][i]==1) {
left = i;
flag = 1;
break;
}
}
if(flag == 1) {
break;
}
}
for(int i = n;i>=1;i--) {
int flag = 0;
for(int j = 1;j<=m;j++) {
if(arr[j][i]==1) {
right = i;
flag = 1;
break;
}
}
if(flag == 1) {
break;
}
}
if(hasS(arr,up,down,left,right)) {
countS++;
}else if(has8(arr,up,down,left,right)) {
count8++;
}else {
int updownMID = 0;
for(int i = up;i<=down;i++) {
int flag = 0;
for(int j = left;j<=right;j++) {
if(arr[i][j]==1) {
flag = 1;
break;
}
}
if(flag == 0) {
updownMID = i;
break;
}
}
int leftrightMID = 0;
for(int i = left;i<=right;i++) {
int flag = 0;
for(int j = up;j<=down;j++) {
if(arr[j][i]==1) {
flag = 1;
break;
}
}
if(flag == 0) {
leftrightMID = i;
break;
}
}
count(arr,up,updownMID,left,leftrightMID);
count(arr,updownMID,down,left,leftrightMID);
count(arr,up,updownMID,leftrightMID,right);
count(arr,updownMID,down,leftrightMID,right);
}
}
static boolean hasS(int[][] arr,int up,int down,int left,int right) {
if((down-up)%2==1) {
return false;
}
int mid = (up+down)/2;
for(int i = up;i<=down;i++) {
for(int j = left;j<=right;j++) {
if(i==up||i==mid||i==down) {
if(arr[i][j]==0) {
return false;
}
}else if(j==left&&i<=mid) {
if(arr[i][j]==0) {
return false;
}
}else if(j==right&&i>=mid) {
if(arr[i][j]==0) {
return false;
}
}else {
if(arr[i][j]==1) {
return false;
}
}
}
}
return true;
}
static boolean has8(int[][] arr,int up,int down,int left,int right) {
if((down-up)%2==1) {
return false;
}
int mid = (up+down)/2;
for(int i = up;i<=down;i++) {
for(int j = left;j<=right;j++) {
if(i==up||i==mid||i==down||j==left||j==right) {
if(arr[i][j]==0) {
return false;
}
}else {
if(arr[i][j]==1) {
return false;
}
}
}
}
return true;
}
}
第四题还没测试,第一个样例太长了
不过应该算法没大问题,就是有些复杂
简单说一下我的算法,拿到一个矩阵,有长和宽
然后四个边向内压缩,遇到全是0的无效边剔除,最后得到up,down,left,right四个边(这四个边都含有1)
这个剩下的矩阵就有可能是S或者8
判断一次S,判断一次8,如果有,那就计数,如果没有,进行切割
从上往下找一行全0,叫做updownMID
然后从左往右找一行全0,叫做leftrightMID
一共得到up,updownMID,down,left,leftrightMID,right这六条边
这六条边就可以把这个大矩阵分成四个小矩阵,这四个小矩阵再循环判断。
大概就这样,看不懂的我写的,以及有好算法的,欢迎留言讨论。