基础练习 芯片测试
时间限制:1.0s 内存限制:512.0MB
问题描述
有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
给出所有芯片的测试结果,问哪些芯片是好芯片。
输入格式
输入数据第一行为一个整数n,表示芯片个数。
第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i, j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本身进行测试)。
输出格式
按从小到大的顺序输出所有好芯片的编号
样例输入
3
1 0 1
0 1 0
1 0 1
样例输出
1 3
分析:我写的太麻烦了,其实只用一个数组,竖着对1进行累加,然后看它是否大于行数的一半就行了。
芯片测试-代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| import java.util.Scanner;
public class Main {
public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=Integer.parseInt(sc.nextLine()); String[] arr=new String[n]; int[] count=new int[n]; for (int i = 0; i < arr.length; i++) { arr[i]="..."; } int k=0; for (int i = 0; i < arr.length; i++) { String s=sc.nextLine(); boolean fa=true; for (int j = 0; j < arr.length; j++) { if(arr[j].equals(s)){ count[j]++; fa=false; break; } } if(fa){ arr[k]=s; count[k]=1; } k++; } int max=0; for (int i = 0; i < count.length; i++) { if(count[i]>max){ max=count[i]; k=i; } } char[] ch=arr[k].replaceAll(" ", "").toCharArray(); for (int i = 0; i < ch.length; i++) { if(ch[i]=='1') System.out.print(i+1+" "); } } }
|
基础练习 FJ的字符串
时间限制:1.0s 内存限制:512.0MB
问题描述
FJ在沙盘上写了这样一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律并写所有的数列AN吗?
输入格式
仅有一个数:N ≤ 26。
输出格式
请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
ABACABA
分析:用递归和直接循环做都是很简单的。题目中说N<=26但是这两种方法测大于15以上的好像都出来不了结果。蓝桥杯上面的数据还是太少了,居然让我过了。
FJ的字符串-代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import java.util.Scanner;
public class Main {
public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); //直接拼接 String str="A"; for (int i = 1; i < n; i++) { str=str+(char)('A'+i)+str; } System.out.println(str); } //递归做的 // private static String getAN(int n) { // if(n==0) // return "A"; // return getAN(n-1)+(char)(n+'A')+getAN(n-1); // } }
|
基础练习 Sine之舞
时间限制:1.0s 内存限制:512.0MB
问题描述
最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设
An=sin(1–sin(2+sin(3–sin(4+…sin(n))…)
Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
输入格式
仅有一个数:N<201。
输出格式
请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1
分析:这个是参考别人的,看了半天没发现里面的规律,它应该多弄几个测试样例的。然后它的测试数据也居然只有一个。
Sine之舞-代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| import java.util.Scanner; public class Sine至舞 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); StringBuffer sn = new StringBuffer(); for (int i = 1; i <= n; i++) { StringBuffer ai = new StringBuffer(); getAi(ai, i); ai.append("+" + (n - i + 1)); sn.append(ai); if ((n - i + 1) != 1) { sn.insert(0, "("); sn.append(")"); } } System.out.println(sn.toString()); } } private static void getAi(StringBuffer ai, int i) { ai.append("sin(1)"); for (int j = 2; j <= i; j++) { int len = ai.length(); for (int j2 = len - 1; j2 > 0; j2--) { if (ai.charAt(j2) != ')') { if (j % 2 == 0) { String temp = (j - 1) + "-sin(" + j + ")"; ai.replace(j2, j2 + 1, temp); } else { String temp = (j - 1) + "+sin(" + j + ")"; ai.replace(j2, j2 + 1, temp); } break; } } } } }
|
基础练习 矩形面积交
时间限制:1.0s 内存限制:512.0MB
问题描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
分析:两个矩形可以看出四个横着的线,和四个竖着的线。中间两根的距离即相交部分的长宽,当然首先应该判断是否有相交的部分,其实可以用数学知识来解,即相交圆的知识。
矩形面积交-代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| import java.util.Scanner; import java.math.BigDecimal;
public class 矩形面积交 {
public static void main(String[] args) { double[] arr1=new double[4]; double[] arr2=new double[4]; Scanner sc=new Scanner(System.in); while(sc.hasNext()){ for (int i = 0; i < arr1.length; i++) { arr1[i]=sc.nextDouble(); } for (int i = 0; i < arr1.length; i++) { arr2[i]=sc.nextDouble(); } double[] arr3=new double[4]; double[] arr4=new double[4]; //长 arr3[0]=arr1[0]; arr3[1]=arr1[2]; arr3[2]=arr2[0]; arr3[3]=arr2[2]; if((arr1[0]>arr2[0]&&arr1[0]>arr2[2])&&(arr1[2]>arr2[0]&&arr1[2]>arr2[2])){ System.out.println("0.00"); return; } if((arr1[0]<arr2[0]&&arr1[0]<arr2[2])&&(arr1[2]<arr2[0]&&arr1[2]<arr2[2])){ System.out.println("0.00"); return; } for (int i = 0; i < arr4.length; i++) { for (int j = 0; j < arr4.length; j++) { if(arr3[i]<arr3[j]){ double t=arr3[i]; arr3[i]=arr3[j]; arr3[j]=t; } } } double chang=Math.abs(arr3[2]-arr3[1]); //宽 arr4[0]=arr1[1]; arr4[1]=arr1[3]; arr4[2]=arr2[1]; arr4[3]=arr2[3]; for (int i = 0; i < arr4.length; i++) { for (int j = 0; j < arr4.length; j++) { if(arr4[i]<arr4[j]){ double t=arr4[i]; arr4[i]=arr4[j]; arr4[j]=t; } } } double kuan=Math.abs(arr4[2]-arr4[1]); double d=kuan*chang; BigDecimal bd=BigDecimal.valueOf(d); String str=bd.setScale(2, BigDecimal.ROUND_HALF_UP).toString(); System.out.println(str); } } }
|
基础练习 回形取数
时间限制:1.0s 内存限制:512.0MB
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
样例输入
3 2
1 2
3 4
5 6
样例输出
1 3 5 6 4 2
分析:同学之前问过和这类似的个题,前几天写了下转方向时写烦了,就没写了。今天再写了下,居然一下子就写出来了。就是那么一圈圈的输出的
回形取数-代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| import java.util.Scanner;
public class 回形取数 {
public static void main(String[] args) { Scanner sc=new Scanner(System.in); int c=sc.nextInt(); int r=sc.nextInt(); int[][] arr=new int[c][r]; for (int i = 0; i < c; i++) { for (int j = 0; j < r; j++) { arr[i][j]=sc.nextInt(); } } int count=0; int quanshu=0; while(count<c*r){ //下 for (int i = quanshu; i < c-quanshu; i++) { if(count==c*r)break; System.out.print(arr[i][quanshu]+" "); count++; } quanshu++; //右 for (int i = quanshu; i <= r-quanshu; i++) { if(count==c*r)break; System.out.print(arr[c-quanshu][i]+" "); count++; } //上 for (int i =c-quanshu-1; i >=quanshu-1; i--) { if(count==c*r)break; System.out.print(arr[i][r-quanshu]+" "); count++; } //左 for (int i =r-quanshu-1; i >=quanshu; i--) { if(count==c*r)break; System.out.print(arr[quanshu-1][i]+" "); count++; } } } }
|
放假的第二天了,明天可能有事写不了。今天就多写点。。。