2016-06-14 21:13
C++ 酱油元帅:Java写的,为了图快变量名比较逗逼,请见谅
第一题
import java.util.*;
public class test1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int no = in.nextInt();
List<List<Integer>> kezhi = new ArrayList<>();
for(int i = 0; i < no; i++) {
String kezhi_str = in.next();
ArrayList<Integer> kezhi_lst = new ArrayList<>();
for(char c: kezhi_str.toCharArray()) {
kezhi_lst.add(c - '0');
}
kezhi.add(kezhi_lst);
}
int cnt = generateMethod(kezhi, no-1).size();
System.out.println(cnt);
}
}
public static List<Set<Integer>> generateMethod(List<List<Integer>> kezhi, int i) {
if(i == 0) {
List<Set<Integer>> res = new ArrayList<>();
for(int duishou: kezhi.get(0)) {
Set<Integer> duishoujihe = new HashSet<>();
duishoujihe.add(duishou);
res.add(duishoujihe);
}
return res;
} else {
List<Set<Integer>> zhiqianduishoujiheliebiao = generateMethod(kezhi, i-1);
List<Set<Integer>> res = new ArrayList<>();
for(Set<Integer> zhiqianduishoujihe: zhiqianduishoujiheliebiao) {
for(int duishou: kezhi.get(i)) {
if(!zhiqianduishoujihe.contains(duishou)) {
Set<Integer> xinduishoujihe = new HashSet<>();
xinduishoujihe.addAll(zhiqianduishoujihe); xinduishoujihe.add(duishou);
res.add(xinduishoujihe);
}
}
}
return res;
}
}
}
第一题简单地利用递归就能满足要求了,不用想得很复杂,就算超时了再改就行了
***************************************************************************************************
第二题
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class test2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextLong()) {
int cost = in.nextInt();
long money = in.nextInt();
long cnt = 0;
long min_paid = (long)Math.ceil(cost/0.95);
long max_paid = Math.min((long)Math.floor(cost/0.90), money);
while(min_paid%5 != 0) min_paid++;
while (max_paid%5 != 0) max_paid--;
if(max_paid >= min_paid)
cnt = (max_paid - min_paid) / 5 + 1;
System.out.println(cnt);
}
}
}
第二题主要是int有可能会溢出,所以尽量用long,还有就是边界处理有一点麻烦
************************************************************************************************
第三题
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class test3 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
long S = in.nextLong();
long cnt = 0;
for(long i = 0; i*i < S; i++) {
long resi = S - i*i;
if(hasRoot(resi)) cnt++;
}
System.out.println(cnt*4);
}
}
public static boolean hasRoot(long i) {
if(i == 0 || i == 1) return true;
long p = 0, r = i;
while(true) {
long q = p + (r-p)/2;
if(q*q > i) r = q;
else if(q*q < i) p = q;
else return true;
if(p > r) return false;
if(r-p <= 1) {
if(r*r == i || p*p == i) return true;
else return false;
}
}
}
}
第三题也是可能有溢出问题,所有直接上long,然后就是判断整数有没有根用了一个二分法

0 点赞 评论 收藏
分享
创作者周榜
更多
关注他的用户也关注了: