0 照例说闲话
开学以来没做什么,除了刷了快50道Basic的算法题,就是复习三级偏硬和上课(上课还不听)。一周时间50题,感觉自己的算法并没有提高,虽然有总结和不断的看别人的好程序,但是感觉真正学到的并不多,很多是套路,还有很多是“卧槽我程序和他一样为啥我超时哦因为我是java”的自我安慰。
以下的50道题并不是都AC了,甚至连绝大部分AC都算不上,但是网上查了一下没有PAT的java代码,所以仅作个人整理和参考用。不过如非必要我是不会调用java函数的。。所以。。。除了字符串操作和集合貌似和C也差不多。
题目来源:http://www.patest.cn/contests/pat-b-practise
1001. 害死人不偿命的(3n+1)猜想 (15/15)
卡拉兹(Callatz)猜想:
对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步(砍几下)才能得到n=1?
输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。
输出格式:输出从n计算到1需要的步数。
输入样例:3输出样例:
5
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int i=0;
while(n!=1){
if(n%2==0){
n=n/2;
}else{
n=(3*n+1)/2;
}
i++;
}
System.out.println(i);
}
}
}
一道水题,没什么好说的。
1002. 写出这个数 (19/20)
读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。
输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1空格,但一行中最后一个拼音数字后没有空格。
输入样例:1234567890987654321123456789输出样例:
yi san wu
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String string=sc.nextLine();
int s=0;
for(int i=0;i<string.length();i++){
char tempChar = string.charAt(i);
s+=(tempChar-48);
}
int bai=s/100;
if(bai!=0){
System.out.print(F(bai));
System.out.print(" ");
}
int shi=s%100/10;
if(shi!=0){
System.out.print(F(shi));
System.out.print(" ");
}
int ge=s%10;
System.out.println(F(ge));
}
public static String F(int a){
String s="";
switch(a){
case 0:s="ling";break;
case 1:s="yi";break;
case 2:s="er";break;
case 3:s="san";break;
case 4:s="si";break;
case 5:s="wu";break;
case 6:s="liu";break;
case 7:s="qi";break;
case 8:s="ba";break;
case 9:s="jiu";break;
}
return s;
}
}
在有一个测试点上是答案错误,想了挺久不是很明白,后期再补上。
1003. 我要通过!(20/20)
“答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。
得到“答案正确”的条件是:
1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
输入格式:每个测试输入包含1个测试用例。第1行给出一个自然数n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。
输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。
输入样例:8 PAT PAAT AAPATAA AAPAATAAAA xPATx PT Whatever APAAATAA输出样例:
YES YES YES YES NO NO NO NO
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
sc.nextLine();
for(int i=0;i<=n;i++){
String s=sc.nextLine();
if(YESorNO(s))
System.out.println("YES");
else
System.out.println("NO");
}
}
}
private static boolean YESorNO (String s){
int l=s.length();
if(l==3){
if(s.equals("PAT"))
return true;
else
return false;
}
if(s.charAt(0)=='A'){
if(l%2!=0){
boolean xPATx=false;
if(s.substring(0, (l-3)/2).equals(s.substring((l+3)/2,l))){
for(int p=0;p<(l-3)/2;p++){
if(s.substring(0, (l-3)/2).charAt(p)!='A'){
xPATx=false;
break;
}
else
xPATx=true;
}
if(s.substring((l-3)/2, (l+3)/2).equals("PAT")){
return xPATx;
}else{
return false;
}
}
}
int Pnum=0,Tnum=0;
for(int p=1;p<l;p++){
if(s.charAt(p)=='P'){
Pnum++;
}else if(s.charAt(p)=='T'){
Tnum++;
}else if(s.charAt(p)!='A'){
return false;
}
}
if(Pnum==1&&Tnum==1){
int Anum=0;
for(int p=0;p<l;p++){
if(s.charAt(p)=='A')
Anum++;
else
break;
}
String a="",b="",c="";
for(int p=0;p<Anum;p++){
a+="A";
}
if(s.endsWith(a)){
if(s.charAt((s.indexOf("T")-1))=='A'){
c=s.substring(s.indexOf("T")+1, l-Anum);
b=s.substring(Anum+1,l-(a.length()+c.length()+2));
return YESorNO(a+'P'+b+'T'+c);
}else
return false;
}else{
return false;
}
}else {
return false;
}
}else if (s.charAt(0)=='P'){
boolean tempRe=false;
if(s.charAt(l-1)=='T'){
for(int p=1;p<l-1;p++){
if(s.charAt(p)=='A'){
tempRe=true;
}else{
tempRe=false;
break;
}
}
return tempRe;
}
}
return false;
}
}
分为三种情况考虑的,这道题还是想了一段时间的,用了递归,不过我感觉我应该是把题目想复杂了。。
不过看了一下通过率0.24,感觉以我的水平能AC已经很不错了= =
1004. 成绩排名 (20/20)
读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:每个测试输入包含1个测试用例,格式为
第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 ... ... ... 第n+1行:第n个学生的姓名 学号 成绩其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低学生的姓名和学号,字符串间有1空格。
输入样例:3 Joe Math990112 89 Mike CS991301 100 Mary EE990830 95输出样例:
Mike CS991301 Joe Math990112
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
sc.nextLine();
int max=-1,min=101;
String maxs="",mins="";
for(int i=0;i<n;i++){
String s=sc.nextLine();
String subs=s.substring(s.indexOf(" ")+1);
int index=subs.indexOf(" ");
int gra=Integer.parseInt(subs.substring(index+1));
String nam=s.substring(0,index+s.indexOf(" ")+1);
if(gra>max){
max=gra;
maxs=nam;
}
if(gra<min){
min=gra;
mins=nam;
}
}
System.out.println(maxs);
System.out.println(mins);
}
}
}
简单的题目,主要就是考察字符串处理。
1005. 继续(3n+1)猜想 (25/25)
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇到过了,我们称5、8、4、2是被3“覆盖”的数。我们称一个数列中的某个数n为“关键数”,如果n不能被数列中的其他数字所覆盖。
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
输入格式:每个测试输入包含1个测试用例,第1行给出一个正整数K(<100),第2行给出K个互不相同的待验证的正整数n(1<n<=100)的值,数字间用空格隔开。
输出格式:每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用1个空格隔开,但一行中最后一个数字后没有空格。
输入样例:6 3 5 6 7 8 11输出样例:
7 6
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
List<Integer> in=new ArrayList<Integer>();
List<Integer> result=new ArrayList<Integer>();
List<Integer> out=new ArrayList<Integer>();
for(int i=0;i<n;i++){
int c=sc.nextInt();
in.add(c);
result.add(c);
}
for(int i=0;i<n;i++){
int x=in.get(i);
while(x!=1){
if(x%2==0){
x=x/2;
}else{
x=(3*x+1)/2;
}
if(!out.contains(x)&&in.contains(x)){
result.remove(result.indexOf(x));
out.add(x);
}
}
}
Collections.sort(result);
Collections.reverse(result);
if(result.size()!=0){
System.out.print(result.get(0));
for(int i=1;i<result.size();i++){
System.out.print(" "+result.get(i));
}
}
}
}
}
这是一道可能直接写写不对,但是debug一下就能出来的题目。。。每次遇到排序和用到list的题目我就诚心地感激java的恩惠♪(^∇^*)
1006. 换个格式输出整数 (15/15)
让我们用字母B来表示“百”、字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。
输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。
输出格式:每个测试用例的输出占一行,用规定的格式输出n。
输入样例1:234输出样例1:
BBSSS1234输入样例2:
23输出样例2:
SS123
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int bai=n/100;
int shi=n%100/10;
int ge=n%10;
String out="";
for(int i=0;i<bai;i++){
out+="B";
}
for(int i=0;i<shi;i++){
out+="S";
}
for(int i=1;i<ge+1;i++){
out+=String.valueOf(i);
}
System.out.println(out);
}
}
}
没有任何难度,好像也没有需要注意的地方。如果遇到这种题,要记得“同学们!这是道送分题呐!”
1007. 素数对猜想 (20/20)
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:20输出样例:
4
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int s=0;
for(int i=5;i<=n;i=i+2){
if(Su(i)&&Su(i-2)){
s++;
}
}
System.out.println(s);
}
}
private static boolean Su(int i) {
for(int j=3;j<=Math.sqrt(i);j++){
if(i%j==0)
return false;
}
return true;
}
}
这道题好像也没有什么坑。一道送分题。
1008. 数组元素循环右移问题 (20/20)
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,之间用空格分隔。
输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:6 2 1 2 3 4 5 6输出样例:
5 6 1 2 3 4
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int m=sc.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++){
a[i]=sc.nextInt();
}
for(int i=0;i<m;i++){
RR(a);
}
System.out.print(a[0]);
for(int i=1;i<n;i++){
System.out.print(" "+a[i]);
}
}
}
private static void RR(int[] a) {
int temp=a[a.length-1];
for(int i=a.length-1;i>0;i--){
a[i]=a[i-1];
}
a[0]=temp;
}
}
这道题!我想着,只要我输出结果对,你管我写程序符不符合题意呢。于是我第一次提交的时候就直接在录入整数的时候直接把它按照要求存数组了。然而,真是作死。。果然不会AC。于是老老实实按照题目要求做循环=-=
1009. 说反话 (20/20)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:Hello World Here I Come输出样例:
Come I Here World Hello
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
List<String> out = new ArrayList<String>();
while(!s.equals("") && s!=null){
if(s.contains(" ")){
out.add(s.substring(0,s.indexOf(" ")));
s=s.substring(s.indexOf(" ")+1);
}
else {
out.add(s.trim());
break;
}
}
Collections.reverse(out);
System.out.print(out.get(0));
for(int i=1;i<out.size();i++){
System.out.print(" "+out.get(i));
}
}
}
}
没什么难度,简单的字符串处理,只是希望遇到这种题的时候我能速度再快一点=-=
1010. 一元多项式求导 (25/25)
设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为n*xn-1。)
输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。
输入样例:3 4 -5 2 6 1 -2 0输出样例:
12 3 -10 1 6 0
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
boolean f=true,p=false;
while(sc.hasNext()){
int zhi=sc.nextInt();
int mi=sc.nextInt();
if(mi!=0){
zhi=zhi*mi;
mi=mi-1;
if(f){
f=false;
System.out.print(zhi+" "+mi);
p=true;
}
else{
System.out.print(" "+zhi+" " + mi);
p=true;
}
}
if(!p){
System.out.print(0+" "+0);
}
}
}
}
这道题需要注意的就是,其实它题目中已经提醒你的0 0,但是并不是那么容易想到,其它没什么。
1011. A+B和C (15/15)
给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。
输入格式:
输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。
输出格式:
对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。
输入样例:4 1 2 3 2 3 4 2147483647 0 2147483646 0 -2147483648 -2147483647输出样例:
Case #1: false Case #2: true Case #3: true Case #4: false
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
for(int i=0;i<n;i++){
BigInteger a=sc.nextBigInteger();
BigInteger b=sc.nextBigInteger();
BigInteger c=sc.nextBigInteger();
if(a.add(b).compareTo(c)==1){
System.out.println("Case #"+(i+1)+": "+"true");
}else{
System.out.println("Case #"+(i+1)+": "+"false");
}
}
}
}
}
炒鸡无敌放送大水题——不过是针对JAVA组来说。。感恩BigInteger!!
1012. 数字分类 (19/20)
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
- A1 = 能被5整除的数字中所有偶数的和;
- A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;
- A3 = 被5除后余2的数字的个数;
- A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
- A5 = 被5除后余4的数字中最大数字。
输入格式:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。
输出格式:
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。
输入样例1:13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例1:30 11 2 9.7 9
输入样例2:8 1 2 4 5 6 7 9 16
输出样例2:N 11 2 N 9
import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int n1=0,n2=0,n3=0,n4=0,n5=0;
int a1=0,a2=0,a22=-1,a5=0;
double a4=0;
for(int i=0;i<n;i++){
int x=sc.nextInt();
if(x%5==0){
if(x%2==0){
a1+=x;
n1++;
}
}else if(x%5==1){
n2++;
a22=-a22;
a2+=a22*x;
}else if(x%5==2){
n3++;
}else if(x%5==3){
n4++;
a4+=x;
}else if(x%5==4){
n5++;
if(x>a5)a5=x;
}
}
if(n1==0)System.out.print("N");
else System.out.print(a1);
if(n2==0)System.out.print(" N");
else System.out.print(" " +a2);
if(n3==0)System.out.print(" N");
else System.out.print(" " +n3);
DecimalFormat df=new DecimalFormat("0.#");
if(n4==0)System.out.print(" N");
else System.out.print(" " +df.format(a4/n4*1.0));
if(n5==0)System.out.print(" N");
else System.out.print(" " +a5);
}
}
}
有一个测试点运行超时。这道题除了步骤多了点没什么,但是超时问题。。。我只会暴力解。
1013. 数素数 (19/20)
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数。
输入格式:
输入在一行中给出M和N,其间以空格分隔。
输出格式:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入样例:5 27输出样例:
11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int m=sc.nextInt();
int n=sc.nextInt();
int[] su=new int[4000];
su[0]=2;
int index=1;
for(int i=3;i<10000;i+=2){
if(Su(i))
su[index++]=i;
}
int num=n-m+1;
int hang=num/10;
int yu=num%10;
m=m-1;
for(int i=0;i<hang;i++){
for(int j=0;j<10;j++){
if(j==0)
System.out.print(su[m++]);
else
System.out.print(" "+su[m++]);
}
System.out.println();
}
for(int i=0;i<yu;i++){
if(i==0) System.out.print(su[m++]);
else System.out.print(" "+su[m++]);
}
}
}
private static boolean Su(int i){
for(int j=2;j<=Math.sqrt(i);j++){
if(i%j==0)
return false;
}
return true;
}
}
一个测试点答案错误。。不是很明白为什么。后期补上。
刚发完14我就高烧39.5℃躺床上了:)现在我继续来更新。因为很累很懒,所以就不复制题目了。
1014. 福尔摩斯的约会 (20/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
String[] day =new String[]{"MON","TUE","WED","THU","FRI","SAT","SUN"};
while(sc.hasNext()){
String a=sc.nextLine();
String b=sc.nextLine();
String c=sc.nextLine();
String d=sc.nextLine();
char x1='A',x2='A';
int num=0,x=0;
for(int i=0;i<a.length()&&i<b.length();i++){
if(num==0){
if(a.charAt(i)>='A'&&a.charAt(i)<='G'&&a.charAt(i)==b.charAt(i)){
x1=a.charAt(i);
num++;
}
}else if(num==1){
if(a.charAt(i)==b.charAt(i)&&((a.charAt(i)>='A'&&a.charAt(i)<='N')||(a.charAt(i)>='0'&&a.charAt(i)<='9'))){
x2=a.charAt(i);
num++;
}
}else if(num==2){
break;
}
}
System.out.print(day[x1-'A']+" ");
if(x2>='0'&&x2<='9') System.out.print("0"+x2+":");
if(x2>='A'&&x2<='Z') System.out.print(x2-'A'+10+":");
for(int i=0;i<c.length()&&i<d.length();i++){
if(c.charAt(i)==d.charAt(i)&& Character.isLetter(c.charAt(i))){
x=i;
break;
}
}
if(x<10) System.out.print("0"+x);
else System.out.print(x);
}
}
}
这道题提交了几次才AC的,主要是少考虑了题目中出现字母/数字的范围。主要考点是,两个字符串中第一个相同的字母。
1015. 德才论 (16/25)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n= sc.nextInt();
int l=sc.nextInt();
int h=sc.nextInt();
int[][] table1=new int[n][4];
int[][] table2=new int[n][4];
int[][] table3=new int[n][4];
int[][] table4=new int[n][4];
int[] temp=new int[3];
int a=0,b=0,c=0,d=0;
for(int i=0;i<n;i++){
temp[0]=sc.nextInt();
temp[1]=sc.nextInt();
temp[2]=sc.nextInt();
if(temp[1]<l || temp[2]<l){
}else if(temp[1]>=h&&temp[2]>=h){
table1[a][0]=temp[0];
table1[a][1]=temp[1];
table1[a][2]=temp[2];
table1[a++][3]=temp[1]+temp[2];
}else if(temp[1]>=h&&temp[2]<h){
table2[b][0]=temp[0];
table2[b][1]=temp[1];
table2[b][2]=temp[2];
table2[b++][3]=temp[1]+temp[2];
}else if(temp[1]<h&&temp[2]<h&&temp[1]>=temp[2]){
table3[c][0]=temp[0];
table3[c][1]=temp[1];
table3[c][2]=temp[2];
table3[c++][3]=temp[1]+temp[2];
}else{
table4[d][0]=temp[0];
table4[d][1]=temp[1];
table4[d][2]=temp[2];
table4[d++][3]=temp[1]+temp[2];
}
}
sort(table1,a);sort(table2,b);sort(table3,c);sort(table4,d);
System.out.println(a+b+c+d);
for(int i=0;i<a;i++){
System.out.println(table1[i][0]+" "+table1[i][1]+" "+table1[i][2]);
}
for(int i=0;i<b;i++){
System.out.println(table2[i][0]+" "+table2[i][1]+" "+table2[i][2]);
}
for(int i=0;i<c;i++){
System.out.println(table3[i][0]+" "+table3[i][1]+" "+table3[i][2]);
}
for(int i=0;i<d;i++){
System.out.println(table4[i][0]+" "+table4[i][1]+" "+table4[i][2]);
}
}
}
private static void sort(int[][] table,int size){
for(int i=0;i<size;i++){
for(int j=0;j<size-i-1;j++){
if(table[j][3]<table[j+1][3]){
int temp=table[j][0];
table[j][0]=table[j+1][0];
table[j+1][0]=temp;
temp=table[j][1];
table[j][1]=table[j+1][1];
table[j+1][1]=temp;
temp=table[j][2];
table[j][2]=table[j+1][2];
table[j+1][2]=temp;
temp=table[j][3];
table[j][3]=table[j+1][3];
table[j+1][3]=temp;
}else if(table[j][3]==table[j+1][3]){
if(table[j][1]<table[j+1][1]){
int temp=table[j][0];
table[j][0]=table[j+1][0];
table[j+1][0]=temp;
temp=table[j][1];
table[j][1]=table[j+1][1];
table[j+1][1]=temp;
temp=table[j][2];
table[j][2]=table[j+1][2];
table[j+1][2]=temp;
temp=table[j][3];
table[j][3]=table[j+1][3];
table[j+1][3]=temp;
}else if(table[j][1]==table[j+1][1]){
if(table[j][0]>table[j+1][0]){
int temp=table[j][0];
table[j][0]=table[j+1][0];
table[j+1][0]=temp;
temp=table[j][1];
table[j][1]=table[j+1][1];
table[j+1][1]=temp;
temp=table[j][2];
table[j][2]=table[j+1][2];
table[j+1][2]=temp;
temp=table[j][3];
table[j][3]=table[j+1][3];
table[j+1][3]=temp;
}
}
}
}
}
}
}
这道题我的方法实在是太暴力直接了,用了太多的循环,而且用数组就是一个错误,不过我现在会用内部类了,不知道这样是不是不会超时。
有三个测试点超时,情理之中,二维数组还这么多循环,程序冗余而复杂,我自己都懒得看= =
1016. 部分A+B (15/15)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String a=String.valueOf(sc.nextInt());
int da=sc.nextInt();
String b=String.valueOf(sc.nextInt());
int db=sc.nextInt();
String numa="",numb="";
for(int i=0;i<a.length();i++){
if(a.charAt(i)==('0'+da))
numa+=String.valueOf(da);
}
for(int i=0;i<b.length();i++){
if(b.charAt(i)==('0'+db))
numb+=String.valueOf(db);
}
if(numa.equals("")) numa="0";
if(numb.equals("")) numb="0";
System.out.println(Integer.parseInt(numa)+Integer.parseInt(numb));
}
}
}
唔这道题没什么难度,不说了。
1017. A除以B (20/20)
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
BigInteger a=sc.nextBigInteger();
int b=sc.nextInt();
BigInteger[] re=a.divideAndRemainder(new BigInteger(String.valueOf(b)));
System.out.print(re[0]+" "+re[1]);
}
}
}
感谢BigInteger~\(≧▽≦)/~
1018. 锤子剪刀布 (18/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
sc.nextLine();
int aw=0,al=0,ap=0,bw=0,bl=0,bp=0;
int ac=0,aj=0,ab=0,bc=0,bj=0,bb=0;
for(int i=0;i<n;i++){
String temp=sc.nextLine();
char a=temp.charAt(0);
char b=temp.charAt(2);
if(a==b){
ap++;bp++;
}else if(a=='C'&&b=='B'){
al++;bw++;
bb++;
}else if(a=='C'&&b=='J'){
aw++;bl++;
ac++;
}else if(a=='B'&&b=='C'){
aw++;bl++;
ab++;
}else if(a=='B'&&b=='J'){
al++;bw++;
bj++;
}else if(a=='J'&&b=='C'){
al++;bw++;
bc++;
}else if(a=='J'&&b=='B'){
aw++;bl++;
aj++;
}
}
System.out.println(aw+" "+ap+" "+al);
System.out.println(bw+" "+bp+" "+bl);
if(ab<ac){
if(ac<aj)
System.out.print('J');
else System.out.print('C');
}else if(ab<aj){
System.out.print('J');
}else System.out.print('B');
if(bb<bc){
if(bc<bj)
System.out.print(" J");
else System.out.print(" "+'C');
}else if(bb<bj){
System.out.print(" "+'J');
}else System.out.print(" "+'B');
}
}
}
一个测试点超时。我觉得可能有优化的方法,但是效果可能不大。在if else处判断浪费了过多时间,如果改用switch的话可能会好一点。但也只是可能而已。。思路的暴力直接决定了我程序的超时。。
1019. 数字黑洞 (20/20)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
List<Integer> list=new ArrayList<Integer>();
list.add(n/1000);
list.add(n%1000/100);
list.add(n%100/10);
list.add(n%10);
Collections.sort(list);
Collections.reverse(list);
int zuo1,zuo2,you;
zuo1= list.get(0)*1000+list.get(1)*100+list.get(2)*10+list.get(3);
Collections.reverse(list);
zuo2= list.get(0)*1000+list.get(1)*100+list.get(2)*10+list.get(3);
you=zuo1-zuo2;
if(you!=0){
while(you!=6174){
System.out.print(zuo1/1000);
System.out.print(zuo1%1000/100);
System.out.print(zuo1%100/10);
System.out.print(zuo1%10);
System.out.print(" - ");
System.out.print(zuo2/1000);
System.out.print(zuo2%1000/100);
System.out.print(zuo2%100/10);
System.out.print(zuo2%10);
System.out.print(" = ");
list.set(0, you/1000);
System.out.print(you/1000);
list.set(1, you%1000/100);
System.out.print(you%1000/100);
list.set(2, you%100/10);
System.out.print(you%100/10);
list.set(3, you%10);
System.out.print(you%10);
System.out.println();
Collections.sort(list);
Collections.reverse(list);
zuo1= list.get(0)*1000+list.get(1)*100+list.get(2)*10+list.get(3);
Collections.reverse(list);
zuo2= list.get(0)*1000+list.get(1)*100+list.get(2)*10+list.get(3);
you=zuo1-zuo2;
}
System.out.print(zuo1/1000);
System.out.print(zuo1%1000/100);
System.out.print(zuo1%100/10);
System.out.print(zuo1%10);
System.out.print(" - ");
System.out.print(zuo2/1000);
System.out.print(zuo2%1000/100);
System.out.print(zuo2%100/10);
System.out.print(zuo2%10);
System.out.print(" = ");
System.out.print(you/1000);
System.out.print(you%1000/100);
System.out.print(you%100/10);
System.out.print(you%10);
System.out.println();
}else{
System.out.print(zuo1/1000);
System.out.print(zuo1%1000/100);
System.out.print(zuo1%100/10);
System.out.print(zuo1%10);
System.out.print(" - ");
System.out.print(zuo2/1000);
System.out.print(zuo2%1000/100);
System.out.print(zuo2%100/10);
System.out.print(zuo2%10);
System.out.print(" = ");
System.out.print(you/1000);
System.out.print(you%1000/100);
System.out.print(you%100/10);
System.out.print(you%10);
System.out.println();
}
}
}
}
除了暴力还是暴力。
1020. 月饼 (13/25)
import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
double m=sc.nextInt();
double[][] table=new double[n][2];
for(int i=0;i<n;i++){
table[i][0]=sc.nextInt();
}
for(int i=0;i<n;i++){
table[i][1]=sc.nextInt();
table[i][1]=table[i][1]/table[i][0];
}
sort(table,n);
int i=0;double sum=0;
while(m>0&&i<n){
if(m>table[i][0]){
m=m-table[i][0];
sum+=table[i][0]*table[i][1];
}else if(m<=table[i][0]){
sum+=m*table[i][1];
m=0;
break;
}
i++;
}
DecimalFormat df=new DecimalFormat("#.00");
System.out.println(df.format(sum));
}
}
private static void sort(double[][] table,int n){
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(table[j][1]<table[j+1][1]){
double temp=table[j][0];
table[j][0]=table[j+1][0];
table[j+1][0]=temp;
temp=table[j][1];
table[j][1]=table[j+1][1];
table[j+1][1]=temp;
}
}
}
}
}
这道题应该是做的最差的一题了吧,就拿了一半分。一个正确一个错误其它都超时。
我的思路是这样,为了让利益最大,让单价最高的先上,如果单价最高的完了还有剩余的需求,就单价其次的上,以此类推。看了一下C语言的做法,似乎从字面上和我的做法也差不多,但是我想应该是我程序写的有问题,我是个连排序算法都写不好的人啊呵呵呵。
1021. 个位数统计 (11/15)
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
BigInteger n=sc.nextBigInteger();
BigInteger shi=new BigInteger("10");
BigInteger ling=new BigInteger("0");
int[] num=new int[10];
int a;
if(n.compareTo(ling)==0){
System.out.println("0:1");
}else{
while(n.compareTo(ling)!=0){
BigInteger[] result=n.divideAndRemainder(shi);
n=result[0];
a=result[1].intValue();
switch(a){
case 0:num[0]++;break;
case 1:num[1]++;break;
case 2:num[2]++;break;
case 3:num[3]++;break;
case 4:num[4]++;break;
case 5:num[5]++;break;
case 6:num[6]++;break;
case 7:num[7]++;break;
case 8:num[8]++;break;
case 9:num[9]++;break;
}
}
for(int i=0;i<10;i++){
if(num[i]!=0){
System.out.println(i+":"+num[i]);
}
}
}
}
}
}
这道题我现在知道不该这么做了,当时一看到1000位整数就暗喜哈哈哈哈BigInteger我来辣,然而,超时等着你:)
这就是个简单的字符串处理题,字符串循环一遍直接ok。
但说是这么说,我也不确定用字符串会不会超时……毕竟JAVA……
1022. D进制的A+B (20/20)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
int a=sc.nextInt()+sc.nextInt();
int m=sc.nextInt();
List<Integer> list=new ArrayList<Integer>();
if(a==0){
System.out.print(0);
}
while(a!=0){
list.add(a%m);
a=a/m;
}
Collections.reverse(list);
for(int i=0;i<list.size();i++){
System.out.print(list.get(i));
}
}
}
}
进制题基本上就是送分题辣,如果没有陷阱的话……这道题应该没有陷阱嗯。
1023. 组个最小数 (20/20)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int[] num=new int[10];
while(sc.hasNext()){
int min=10;
for(int i=0;i<10;i++){
num[i]=sc.nextInt();
if(num[i]!=0&&i<min&&i!=0)
{
System.out.print(i);
min=i;
num[i]--;
}
}
for(int i=0;i<10;i++){
for(int j=0;j<num[i];j++){
System.out.print(i);
}
}
}
}
}
原则就是,先拿个不是0的排上去,之后按照大小排排坐吃果果就OK了。
1024. 科学计数法 (18/20)
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
char fuhao=s.charAt(0);
int index=s.indexOf('E');
String shuzi=s.charAt(1)+s.substring(3, index);
BigInteger shuziint=new BigInteger(shuzi);
BigInteger ling=new BigInteger("0");
int zhishu=Integer.parseInt(s.substring(index+1));
if(shuziint.compareTo(ling)==0){
System.out.print(0);
}else{
if(fuhao=='-'){
System.out.print(fuhao);
}
if(zhishu>0&&zhishu>=shuzi.length()){
System.out.print(shuzi);
for(int i=0;i<zhishu-1;i++){
System.out.print(0);
}
}else if(zhishu>0&&zhishu<shuzi.length()){
System.out.print(shuzi.substring(0,zhishu+1));
if(!shuzi.substring(zhishu+1).equals("")){
System.out.print('.');
System.out.print(shuzi.substring(zhishu+1));}
}else if(zhishu<0){
System.out.print("0.");
for(int i=0;i<-zhishu-1;i++){
System.out.print(0);
}
System.out.print(shuzi);
}else if(zhishu==0){
System.out.print(s.substring(1,index));
}
}
}
}
}
噫。。这道题我也不知道该怎么说,有两个点超时。基本上运行时间要求小于100ms的我都会超时,不知道是不是和if else太多有关。
由于1025,1026都是针对C语言的,所以略过。
1027. 打印沙漏(20/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
char b=sc.next().charAt(0);
int m=n;
if(n%2==0){
n=n-1;
}
int x=0;
for(int i=1;i<23;i++){
if((n+1)/2-i*i>=0&&(n+1)/2-(i+1)*(i+1)<0){
m=m-(2*i*i-1);
x=i;
break;
}
}
for(int i=0;i<x;i++){
for(int p=0;p<i;p++){
System.out.print(' ');
}
for(int j=2*(x-i)-1;j>0;j--){
System.out.print(b);
}
System.out.println();
}
for(int i=x;i<2*x-1;i++){
for(int p=2*x-2-i;p>0;p--){
System.out.print(' ');
}
for(int j=0;j<2*(i-x+1)+1;j++){
System.out.print(b);
}
System.out.println();
}
System.out.println(m);
}
}
}
相对来说还是比较喜欢打印题的,第一简单,第二方便测试,不会有想不到的情况,除非超时。。
1028. 人口普查(15/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
sc.nextLine();
int num=0;
int max=20140906,min=18140906;
int max2=Integer.MIN_VALUE,min2=Integer.MAX_VALUE;
String maxname="",minname="";
for(int i=0;i<n;i++){
String temp=sc.nextLine();
int index=temp.indexOf(' ');
String birth=temp.substring(index+1,index+5)
+temp.substring(index+6, index+8)+temp.substring(index+9);
int birthint=Integer.parseInt(birth);
if(birthint>=min&&birthint<=max){
num++;
if(birthint>max2){
max2=birthint;
String name=temp.substring(0,index);
maxname=name;
}
if(birthint<min2){
min2=birthint;
String name=temp.substring(0,index);
minname=name;
}
}
}
System.out.print(num+" "+minname+" "+maxname);
}
}
}
1分格式错误,4分运行超时。格式错误我现在也知道了,如果没有合理的日期的话,是不会有最年长和最年轻的人的。不过运行超时这个...我都已经只有一个循环了啊摔!可能不能老是字符串处理?字符串处理比较耗时?我也不清楚...
1029. 旧键盘(17/20)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String a=sc.nextLine();a=a.toUpperCase();
String b=sc.nextLine();b=b.toUpperCase();
int ia=0,ib=0;
List<Character> list=new ArrayList<Character>();
while(ia<a.length()&&ib<b.length()){
while(a.charAt(ia)!=b.charAt(ib)){
if(!list.contains(a.charAt(ia))){
list.add(a.charAt(ia));
}
ia++;
}
ia++;ib++;
}
if(ib==b.length()&&ia<a.length()){
for(int i=ia;i<a.length();i++){
if(!list.contains(a.charAt(ia))){
list.add(a.charAt(i));
}
}
}
for(int i=0;i<list.size();i++)
System.out.print(list.get(i));
}
}
}
3分答案错误。自己想没有想出来哪里错,但是我这个笨脑子肯定会想不到一些情况,当时急着睡觉,所以……就略过了。
1030. 完美数列(20/25)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int p=sc.nextInt();
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<n;i++){
list.add(sc.nextInt());
}
Collections.sort(list);
int ans=1;
for(int j=0; j<n; j++ )
for(int i=j+ans; i<n; i++ )
{
if( list.get(i)<=list.get(j)*p ){
if( i-j+1>ans )
{
ans=i-j+1;
}
}
else
break;
}
System.out.println(ans);
}
}
}
3分超时,2分错误,同样,急着睡觉……现在想狠狠甩自己一脸。。
1031. 查验身份证(15/15)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
char[] c=new char[]{'1','0','X','9','8','7','6','5','4','3','2'};
int[] q=new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
while(sc.hasNext()){
int n=sc.nextInt();
boolean flag=false;
sc.nextLine();
for(int i=0;i<n;i++){
String s=sc.nextLine();
int sum=0;boolean flag2=true;
for(int j=0;j<17;j++){
if(s.charAt(j)<'0'||s.charAt(j)>'9'){
System.out.println(s);
flag=true;flag2=false;
break;
}else{
sum+=q[j]*(s.charAt(j)-'0');
}
}
if(flag2){
sum=sum%11;
if(s.charAt(17)==c[sum]){
}else{
System.out.println(s);
flag=true;
}
}
}
if(!flag){
System.out.println("All passed");
}
}
}
}
这个好像没什么好说的,按照思路做下来就行,没有什么坑的。
1032. 挖掘机技术哪家强(17/20)
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Map<Integer,Integer> map=new HashMap<Integer,Integer>();
while(sc.hasNext()){
int n=sc.nextInt();
for(int i=0;i<n;i++){
int bianhao=sc.nextInt();
int fenshu=sc.nextInt();
if(map.containsKey(bianhao)){
map.put(bianhao, map.get(bianhao)+fenshu);
}else{
map.put(bianhao, fenshu);
}
}
int max=map.get(1),maxi=1;
for(int i=2;i<map.size()+1;i++){
if(map.get(i)>max){
max=map.get(i);
maxi=i;
}
}
System.out.println(maxi+" "+max);
}
}
}
一个测试点超时。嗯,我觉得我不应该用map,用内部类就好啊其实。。或者可以用一个10^5大的数组array,然后直接array[bianhao]++也可以,但是我觉得就算这样,java也会超时的。。
1033. 旧键盘打字(17/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String w=sc.nextLine(),w2=w.toLowerCase();
String input=sc.nextLine(),input2=input.toLowerCase();
for(int i=0;i<w.length();i++){
for(int j=0;j<input.length();j++){
char temp=w.charAt(i);
if(temp!='+'){
if(input.charAt(j)==temp||input.charAt(j)==w2.charAt(i)){
input=input.replace(input.charAt(j), '*');
input=input.replace(input2.charAt(j), '*');
break;
}
}else if(temp=='+'){
if(input.charAt(j)!=input2.charAt(j)){
input=input.replace(input.charAt(j), '*');
}
}
}
}
for(int i=0;i<input.length();i++){
if(input.charAt(i)!='*')
System.out.print(input.charAt(i));
}
System.out.println();
}
}
}
一个测试点超时。嗯,双重循环可能的确是比较浪费时间,但是除了这样我也想不到更好的方法了啊。如果先遍历一遍wrong string,然后把不能打出来的存在数组里,然后遍历数组和input string可能会好一点?然后打出来以后我就发现,并不会呵呵呵。
1034. 有理数四则运算(14/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext()){
String temp=sc.nextLine();
String temp2=temp.substring(temp.indexOf(' ')+1);
int a1=Integer.parseInt(temp.substring(0,temp.indexOf('/')));
int b1=Integer.parseInt(temp.substring(temp.indexOf('/')+1,temp.indexOf(' ')));
int a2=Integer.parseInt(temp2.substring(0,temp2.indexOf('/')));
int b2=Integer.parseInt(temp2.substring(temp2.indexOf('/')+1));
String c1=Standard(a1,b1),c2=Standard(a2,b2);
int gongbeishu=gongbeishu(b1,b2);
System.out.println(c1+" + "+c2+" = "+plus(a1, b1, a2, b2, gongbeishu));
System.out.println(c1+" - "+c2+" = "+minus(a1, b1, a2, b2, gongbeishu));
System.out.println(c1+" * "+c2+" = "+cheng(a1, b1, a2, b2));
System.out.println(c1+" / "+c2+" = "+chu(a1, b1, a2, b2));
}
}
private static int gongbeishu(int a,int b){
for(int i=Math.max(a, b);i<=a*b;i++){
if(i%a==0&&i%b==0){
return i;
}
}
return a*b;
}
private static String plus(int a1,int b1,int a2,int b2 ,int fenmu){
a1=a1*(fenmu/b1);
a2=a2*(fenmu/b2);
return Standard((a1+a2),fenmu);
}
private static String minus(int a1,int b1,int a2,int b2,int fenmu){
a1=a1*(fenmu/b1);
a2=a2*(fenmu/b2);
return Standard((a1-a2),fenmu);
}
private static String cheng(int a1,int b1,int a2,int b2){
return Standard((a1*a2),b1*b2);
}
private static String chu(int a1,int b1,int a2,int b2){
if(a2==0) {
return "Inf";
}else if(a1*b2*b1*a2<0){
if(b1*a2<0){
b1=-b1;
a1=-a1;
}
}
return Standard((a1*b2),b1*a2);
}
private static String Standard(int a,int b){
String c="";
if(a!=0){
int yue=1;
int yuea,yueb;
for(int i=2;i<=Math.min(Math.abs(a), b);i++){
if(Math.abs(a)%i==0&&b%i==0){
yue=i;
}
}
yuea=a/yue;yueb=b/yue;
if(a<0)
c+="(";
if(yueb>Math.abs(yuea)){
c=c+a/yue+"/"+b/yue;
}else if(yueb==yuea){
c="1";
}else if(yueb==-yuea){
c="(-1)";
}else if(yuea%yueb==0){
c+=String.valueOf(yuea/yueb);
}
else {
c=c+yuea/yueb+" "+Math.abs(yuea%yueb)+"/"+yueb;
}
if(a<0)
c+=")";
}else{
c="0";
}
return c;
}
}
结果出来挺伤心的,两个测试点超时。这道题还花了我挺多时间的呢,我感觉真的不能用太多if else吧??
忽略时间问题,这个程序我发现的漏洞就是,两个分母相乘,是有可能溢出整型范围的,不过。。:)
1035. 插入与归并(25/25)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int[] biao=new int[n];
int[] biao2=new int[n];
for(int i=0;i<n;i++){
biao[i]=sc.nextInt();
biao2[i]=biao[i];
}
sc.nextLine();
String s=sc.nextLine();
boolean flag=false;
String[] insert=insert(biao);
for(int i=0;i<insert.length;i++){
if(s.equals(insert[i])){
System.out.println("Insertion Sort");
System.out.println(insert[i+1]);
flag=true;
}
}
if(!flag){
String[] merge=merge(biao2);
for(int i=0;i<merge.length;i++){
if(s.equals(merge[i])){
System.out.println("Merge Sort");
System.out.println(merge[i+1]);
}
}
}
}
}
private static String[] merge(int[] a) {
int n=a.length;
int u=0;
for(int i=0;i<8;i++){
if(Math.pow(2, i)-n>=0){
u=i;
break;
}
}
String[] merge=new String[u];
for(int i=1;i<=u;i++){
int geshu=(int)Math.pow(2, i);
int zushu;
zushu=n/geshu;
for(int j=0;j<zushu;j++){
sort(a,j*geshu,(j+1)*geshu-1);
}
if(n-geshu*zushu!=0){
sort(a,geshu*zushu,n-1);
}
merge[i-1]=""+a[0];
for(int p=1;p<a.length;p++){
merge[i-1]=merge[i-1]+" "+a[p];
}
}
return merge;
}
private static void sort(int[] a, int i, int j) {
for(int p=i;p<j;p++){
for(int q=i;q<j+i-p;q++){
if(a[q]>a[q+1]){
int temp=a[q];
a[q]=a[q+1];
a[q+1]=temp;
}
}
}
}
private static String[] insert(int[] a){
String[] insert=new String[a.length-1];
for(int i=1;i<a.length;i++){
int temp=a[i];
for(int j=i-1;j>=0&&temp<a[j];j--){
a[j+1]=a[j];
a[j]=temp;
}
insert[i-1]=""+a[0];
for(int p=1;p<a.length;p++){
insert[i-1]=insert[i-1]+" "+a[p];
}
}
return insert;
}
}
我真喜hen欢si这道题。因为它让我见识了我是怎样一个大!菜!鸟!一个连插入排序和冒泡排序都不会还想参加软件比赛的笨蛋!
我真的不想说,我写对数组某一段(index:i~j范围内)排序时,花了多少时间。我死都没法确定p和q的范围。不过我终于挺过来了,考试之前我要好好过一遍这些:)
1036. 跟奥巴马一起编程(15/15)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
int hang=Integer.parseInt(s.substring(0, s.indexOf(' ')));
char c=s.charAt(s.indexOf(' ')+1);
int lie;
if(hang%2==0){
lie=hang/2;
}else{
lie=hang/2+1;
}
for(int i=0;i<hang;i++){
System.out.print(c);
}
System.out.println();
for(int i=1;i<lie-1;i++){
for(int j=0;j<hang;j++){
if(j==0||j==hang-1)
System.out.print(c);
else System.out.print(' ');
}
System.out.println();
}
for(int i=0;i<hang;i++){
System.out.print(c);
}
}
}
}
感谢奥巴马编的程很简单,否则如果他写了个高级算法我岂不是要死了:)
1037. 在霍格沃茨找零钱(20/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
String pay=s.substring(0,s.indexOf(' '));
String a=s.substring(s.indexOf(' ')+1);
long b=transfer(a)-transfer(pay);
if(b>=0){
System.out.println(transfer2(b));
}else {
System.out.println("-"+transfer2(Math.abs(b)));
}
}
}
public static long transfer(String s){
long a=0;
int g=Integer.parseInt(s.substring(0,s.indexOf('.')));
s=s.substring(s.indexOf('.')+1);
int si=Integer.parseInt(s.substring(0,s.indexOf('.')));
int k=Integer.parseInt(s.substring(s.indexOf('.')+1));
a=g*29*17+si*29+k;
return a;
}
public static String transfer2(long a){
String s="";
int g,si,k;
g=(int)a/(29*17);
si=(int)a%(29*17)/29;
k=(int)a%29;
s=String.valueOf(g)+"."+String.valueOf(si)+"."+String.valueOf(k);
return s;
}
}
和进制转换有点类似吧,就是用字符串处理而已。
1038. 统计同成绩学生(14/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int[] fen=new int[101];
for(int i=0;i<n;i++){
fen[sc.nextInt()]++;
}
int k=sc.nextInt();
for(int i=0;i<k;i++){
int query=sc.nextInt();
if(i==0)System.out.print(fen[query]);
else System.out.print(" "+fen[query]);
}
}
}
}
简单的题,如果暴力的解,就是会超时。我所说的“尼玛我的程序和C语言的一模一样为啥它AC我超时”,这道题就是其中之一。呵呵哒~
1039. 到底买不买(13/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String a=sc.nextLine();
String b=sc.nextLine();
int[] az=new int[123];
int[] bz=new int[123];
for(int i=0;i<a.length();i++){
az[a.charAt(i)]++;
}
for(int i=0;i<b.length();i++){
bz[b.charAt(i)]++;
}
boolean flag=true;
int wrong=0;
for(int i=0;i<100;i++){
if(az[i]<bz[i]){
flag=false;
wrong=wrong+(bz[i]-az[i]);
}
}
if(flag){
System.out.println("Yes "+String.valueOf(a.length()-b.length()));
}else{
System.out.println("No "+wrong);
}
}
}
}
这是一道很重要的题目!!!!!!它好像是蓝桥杯历年考试题目。然而我还做这么烂,还不是超时,就是答案错误。。这道题我一定要好好看一下。
1040. 有几个PAT(15/25)
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
BigInteger num=new BigInteger("0");
BigInteger yi=new BigInteger("1");
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='P'){
for(int j=i+1;j<s.length();j++){
if(s.charAt(j)=='A'){
for(int k=j+1;k<s.length();k++){
if(s.charAt(k)=='T')
num=num.add(yi);
}
}
}
}
}
System.out.println(num.divideAndRemainder(new BigInteger("1000000007"))[1]);
}
}
}
我现在看到这道题代码就好想笑啊哈哈哈哈,这真是傻子都能写出来的代码啊哦不这就是傻子写出来的代码啊。
1041. 考试座位号(15/15)
import java.util.Scanner;
public class Main {
public static class Data{
String zheng;
int pre;
int form;
public Data(String zheng,int pre,int form){
this.zheng=zheng;
this.pre=pre;
this.form=form;
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int N=sc.nextInt();
sc.nextLine();
Data[] data=new Data[N];
for(int i=0;i<N;i++){
String s=sc.nextLine();
String temp=s.substring(15);
data[i]=new Data(s.substring(0,14),
Integer.parseInt(temp.substring(0,temp.indexOf(' '))),
Integer.parseInt(temp.substring(temp.indexOf(' ')+1)));
}
int M=sc.nextInt();
sc.nextLine();
String s2=sc.nextLine();
for(int i=0;i<M;i++){
int pre;
if(s2.contains(" ")){
pre=Integer.parseInt(s2.substring(0,s2.indexOf(' ')));
s2=s2.substring(s2.indexOf(' ')+1);
}else {
pre=Integer.parseInt(s2);
}
for(int j=0;j<N;j++){
if(data[j].pre==pre){
System.out.println(data[j].zheng+" "+data[j].form);
break;
}
}
}
}
}
}
这应该没什么好说的。。
1042. 字符统计(20/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
s=s.toLowerCase();
int[] t=new int[26];
int max=0;char maxc='z'+1;
for(int i=0;i<s.length();i++){
if(s.charAt(i)>='a'&&s.charAt(i)<='z'){
t[s.charAt(i)-'a']++;
if((t[s.charAt(i)-'a']==max&&s.charAt(i)<maxc)||t[s.charAt(i)-'a']>max){
max=t[s.charAt(i)-'a'];
maxc=s.charAt(i);
}
}
}
System.out.println(maxc+" "+max);
}
}
}
字符串处理啦啦啦。
1043. 输出PATest(20/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
int[] t=new int[6];
for(int i=0;i<s.length();i++){
switch(s.charAt(i)){
case 'P':t[0]++;break;
case 'A':t[1]++;break;
case 'T':t[2]++;break;
case 'e':t[3]++;break;
case 's':t[4]++;break;
case 't':t[5]++;break;
}
}
int num=0;
for(int i=0;i<6;i++){
if(t[i]!=0)
num++;
}
while(!(t[0]==0&&t[1]==0&&t[2]==0&&t[3]==0&&t[4]==0&&t[5]==0)){
if(t[0]!=0){System.out.print('P');t[0]--;}
if(t[1]!=0){System.out.print('A');t[1]--;}
if(t[2]!=0){System.out.print('T');t[2]--;}
if(t[3]!=0){System.out.print('e');t[3]--;}
if(t[4]!=0){System.out.print('s');t[4]--;}
if(t[5]!=0){System.out.print('t');t[5]--;}
}
}
}
}
注意while的循环条件不要弄错就行,不过这么粗暴的代码还不超时感恩上帝恩惠。
1044. 火星数字(20/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String[] Mars=new String[]{"tret","jan", "feb", "mar", "apr", "may",
"jun", "jly", "aug", "sep", "oct", "nov", "dec"};
String[] Mars2=new String[]{"","tam", "hel", "maa","huh", "tou",
"kes", "hei", "elo", "syy", "lok", "mer", "jou"};
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
sc.nextLine();
for(int i=0;i<n;i++){
String s=sc.nextLine();
int num=0;
if(s.charAt(0)>='a'&&s.charAt(0)<='z'){
if(s.contains(" ")){
for(int j=1;j<13;j++){
if(Mars2[j].equals(s.substring(0,3))){
num+=13*j;
s=s.substring(4);
break;
}
}
}
for(int j=0;j<13;j++){
if(Mars[j].equals(s)){
num+=j;
}
}
if(num==0&&!s.equals("tret")){
for(int j=0;j<13;j++){
if(Mars2[j].equals(s)){
num+=13*j;
}
}
}
System.out.println(num);
}else{
int number=Integer.parseInt(s);
int shi=number/13;
if(shi==0){
System.out.println(Mars[number%13]);
}else if(number%13!=0){
System.out.println(Mars2[shi]+" "+Mars[number%13]);
}else{
System.out.println(Mars2[shi]);
}
}
}
}
}
}
你是火星人你厉害咯!应该没什么需要注意的,遇到这种题就注意一下特殊情况,0 啊 10 啊 什么的多举几个例子。
1045. 快速排序(12/25)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int N=sc.nextInt();
int[] t=new int[N];
boolean flag;
int num=0;
String s="";
for(int i=0;i<N;i++){
t[i]=sc.nextInt();
}
for(int i=0;i<N;i++){
flag=true;
for(int j=i-1;j>=0;j--){
if(t[j]>t[i]){
flag=false;
break;
}
}
if(flag){
for(int j=i+1;j<N;j++){
if(t[j]<t[i]){
flag=false;
break;
}
}
}
if(flag){
num++;
if(i==0) s+=String.valueOf(t[i]);
else s=s+" "+String.valueOf(t[i]);
}
}
System.out.println(num);
System.out.println(s);
}
}
}
原来刚才那个不是做的最烂的,这个才是。除了一个正确其它全部超时。。。也是啊。
看了一篇文章,基本思路应该是这样才对:首先,主元在排序前和排序后在数组中的位置应该是一样的,但是排序前和排序后在数组中位置一样的并不一定就是主元。所以需要多加一个判断,如果待查元素是当前最大的元素,那么就是主元啦。
1046. 划拳(15/15)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int a=0;int b=0;
for(int i=0;i<n;i++){
boolean flaga=false;
boolean flagb=false;
int ahan=sc.nextInt();
int ahua=sc.nextInt();
int bhan=sc.nextInt();
int bhua=sc.nextInt();
if(ahua==ahan+bhan){
flaga=true;
}
if(bhua==ahan+bhan){
flagb=true;
}
if(flaga!=flagb){
if(flaga){
b++;
}else if(flagb){
a++;
}
}
}
System.out.println(a+" "+b);
}
}
}
简单粗暴,获取判断输出。
1047. 编程团体赛(20/20)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
sc.nextLine();
int[] t=new int[1001];
int max=0;int maxteam=0;
for(int i=0;i<n;i++){
String s=sc.nextLine();
int team=Integer.parseInt(s.substring(0,s.indexOf('-')));
int grade=Integer.parseInt(s.substring(s.indexOf(' ')+1));
t[team]+=grade;
if(t[team]>max){
max=t[team];
maxteam=team;
}
}
System.out.println(maxteam+" "+max);
}
}
}
第一次题目中会多给条件。。不过也无所谓辣,比较简单。
1048. 数字加密(20/20)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String s=sc.nextLine();
List<Character>list=new ArrayList<Character>();
String s1=s.substring(0,s.indexOf(' '));
String s2=s.substring(s.indexOf(' ')+1);
for(int i=1;i<=s1.length()&&i<=s2.length();i++){
if(i%2==1){
int x=(s2.charAt(s2.length()-i)+s1.charAt(s1.length()-i)-96)%13;
if(x>9){
switch(x){
case 10: list.add('J');break;
case 11:list.add('Q');break;
case 12:list.add('K');break;
}
}else{
list.add((char)(x+48));
}
}else{
int x=s2.charAt(s2.length()-i)-s1.charAt(s1.length()-i);
if(x<0) x+=10;
list.add((char)(x+48));
}
}
if(s2.length()>s1.length()){
for(int i=s1.length()+1;i<=s2.length();i++){
list.add(s2.charAt(s2.length()-i));
}
}else if(s1.length()>s2.length()){
for(int i=s2.length()+1;i<=s1.length();i++){
if(i%2==1)
list.add(s1.charAt(s1.length()-i));
else{
int x=-s1.charAt(s1.length()-i)+48;
if(x<0) x+=10;
list.add((char)(x+48));
}
}
}
Collections.reverse(list);
for(int i=0;i<list.size();i++){
System.out.print(list.get(i));
}
}
}
}
虽然麻烦点,但是跟着思路来就好。有一点坑的就是,题目中明确讲了【针对整数B】,所以大家会理解成,A超出B的位数应该就不算了吧;然而并不是这样,以位数最多的算。我是没好好看题然后碰巧蒙对了哈哈哈。
1049. 数列的片段和(15/20)
import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
double sum=0;double s=0;
double[] a=new double[n];
for(int i=0;i<n;i++){
a[i]=sc.nextDouble();
sum+=a[i];
}
for(int j=1;j<=n;j++){
int temp=Math.min(n-j+1, j);
s+=sum*temp;
for(int i=0;i<temp-1;i++){
s=s-(a[i]+a[n-i-1])*(temp-1-i);
}
}
DecimalFormat df=new DecimalFormat("0.00");
System.out.println(df.format(s));
}
}
}
两个测试点超时。。这是我唯一用上我仅剩不多的数学知识的题了吧:-D 这个不用二重循环我是真的不太会,也许用加法会简单点?但是我感觉应该是差不多的。
1050. 螺旋矩阵(22/25)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int N=sc.nextInt();
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<N;i++){
list.add(sc.nextInt());
}
int n=(int) Math.sqrt(N);
int m=N;
if(n*n!=N){
for(;n>=1;n--){
m=N/n;
if(n*m==N)
break;
}
}else{
m=n;
}
Collections.sort(list);
Collections.reverse(list);
int k=N;
int maxi=n-1,maxj=m-1,mini=0,minj=1;
int[][] a=new int[m][n];
int num=1;
int x=0,y=-1;
while(k!=0){
switch(num){
case 1:
y=y+1;
for(int i=y;i<=maxi;i++){
a[x][i]=list.get(N-k);
k--;
y=i;
}
if(maxi>0) maxi--;
num++;
break;
case 2:
x=x+1;
for(int j=x;j<=maxj;j++){
a[j][y]=list.get(N-k);
k--;
x=j;
}
if(maxj>0) maxj--;
num++;
break;
case 3:
y=y-1;
for(int i=y;i>=mini;i--){
a[x][i]=list.get(N-k);
k--;
y=i;
}
if(mini<maxi) mini++;
num++;
break;
case 4:
x=x-1;
for(int j=x;j>=minj;j--){
a[j][y]=list.get(N-k);
k--;
x=j;
}
if(minj<maxj) minj++;
num=1;
break;
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(j==0)
System.out.print(a[i][j]);
else
System.out.print(" "+a[i][j]);
}
System.out.println();
}
}
}
}
2个超时。这道题除了麻烦点,其它应该还好,分成了上下左右移动的四种情况。
Over~