A:排列字母
签到题来了!!!
直接上代码(也可以手推哈)
个人答案:AAAEEEEEEHHHIIILLRRRSSTTWWWY
代码:
import java.util.Arrays;
public class 字母排列 {
public static void main(String[] args) {
String ss="WHERETHEREISAWILLTHEREISAWAY";
char []arr=new char[ss.length()];
for (int i=0;i<ss.length();i++) {
arr[i]=ss.charAt(i);
}
Arrays.sort(arr);
for (int i=0;i<ss.length();i++)
System.out.print(arr[i]);
}
}
B、特殊时间
比赛时没写!!!
个人答案:220
C、纸张尺寸
大题的签到题了!
思路:开一个长度为10的数组,直接存放每一个对应的长宽就好
个人代码:
import java.util.Scanner;
public class 纸张尺寸 {
public static void main(String[] args) {
int [][]arr=new int[10][2];
Scanner sc=new Scanner(System.in);
int a=1189,b=841;
arr[0][0]=1189;
arr[0][1]=841;
for (int i=1;i<10;i++){
arr[i][0]=Math.min(a,b);
if (a>b) {
a /= 2;
}
else{
b/=2;
}
arr[i][1]=Math.min(a,b);
}
String ss=sc.next();
int t=ss.charAt(1)-'0';
System.out.println(arr[t][0]);
System.out.println(arr[t][1]);
}
}
D、求和
我比赛的时候用的是前缀和的方法计算的,每一次取出最前的面的数,和后面的所有数和相乘;
个人代码:
import java.util.Scanner;
public class 求和 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long s=0;
int n=sc.nextInt();
int []arr=new int[n];
for (int i=0;i<n;i++){
arr[i]=sc.nextInt();
s+=arr[i];
}
long count=0;
for (int i=0;i<n;i++){
count+=arr[i]*(s-arr[i]);
s-=arr[i];
}
System.out.println(count);
}
}
测了一下20万个1000,没爆,也就是说200000个1000的结果也是可以出来的,所以直接用的long型,用大数应该也问题不大
E、矩形拼接
这题思路:三个图案组成后,只会有三种情况
4条边;6条边;8条边;
比赛和回来写的不太一样,回来后写只有九十几行代码,比赛直接十多个if用的一百多行代码!!!
个人代码:
import java.util.Scanner;
public class 矩形拼接 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();
int xa,xb,xc,ya,yb,yc;
for (int i=0;i<T;i++){
xa=sc.nextInt();
ya=sc.nextInt();
xb=sc.nextInt();
yb=sc.nextInt();
xc=sc.nextInt();
yc=sc.nextInt();
int t=0,s=0;
if (pd(xa, xb, xc, ya, yb, yc)&&s==0) s=1;
if (pd(ya, xb, xc, xa, yb, yc)&&s==0) s=1;
if (xb==xc&&s==0){
t=1;
if (yb+yc==xa||yb+yc==ya){
System.out.println(4);
s=1;
}
}
if (xb==yc&&s==0){
t=1;
if (yb+xc==xa||yb+xc==ya){
System.out.println(4);
s=1;
}
}
if (yb==xc&&s==0){
t=1;
if (xb+yc==xa||xb+yc==ya){
System.out.println(4);
s=1;
}
}
if (yb==yc&&s==0){
t=1;
if (xb+xc==xa||xb+xc==ya){
System.out.println(4);
s=1;
}
}
if(xa+xb==xc||xa+xb==yc||xa+yb==xc||xa+yb==yc||xa+xc==xb||xa+xc==yb||xa+yc==xb||xa+yc==yb)
t=1;
if(ya+xb==xc||ya+xb==yc||ya+yb==xc||ya+yb==yc||ya+xc==xb||ya+xc==yb||ya+yc==xb||ya+yc==yb)
t=1;
if(xb+xc==xa||xb+xc==ya||xb+yc==xa||xb+yc==ya||yb+xc==xa||yb+xc==ya||yb+yc==xa||yb+yc==ya)
t=1;
if (s==0) {
if (t == 1) {
System.out.println(6);
} else {
System.out.println(8);
}
}
}
}
private static boolean pd(int xa, int xb, int xc, int ya, int yb, int yc) {
int t;
if (xa==xb){
t =1;
if (ya+yb==xc||ya+yb==yc||xa==xc||xa==yc){
System.out.println(4);
return true;
}
}
if (xa==yb){
t =1;
if (ya+xb==xc||ya+xb==yc||xa==xc||xa==yc){
System.out.println(4);
return true;
}
}
if (xa==xc){
t =1;
if (ya + yc == xb || ya + yc == yb){
System.out.println(4);
return true;
}
}
if (xa==yc){
t =1;
if (ya+xc==xb||ya+xc==yb){
System.out.println(4);
return true;
}
}
return false;
}
}
F、选数异或
不会异或,比赛瞎写了一个,然后纯纯就是暴力,不知道对不对(数据不大,如果对的话应该有40%的感觉)!
个人代码:
import java.util.Scanner;
public class 选数异或 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int x=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 a=sc.nextInt(),b=sc.nextInt(),s=0;
for (int j=a;j<b;j++){
for (int k=j+1;k<=b;k++){
if ((arr[j]^arr[k])==x) {
s=1;
System.out.println("yes");
break;
}
}
if (s==1)
break;
}
if (s==0)
System.out.println("no");
}
}
}
G:GCD
用我的话说:这就是一个骗人的题!!!
问gcd(a+k,b+k)的最大公约数,不难想到最大公约数为abs(a-b)
举例:a=10,b=17
这俩数同时增加k可以获得最大公约数为7;
10+4,17+4;即14和21的最大公约数,满足7;并且无论怎么凑都无法获得大于7的公约数
所以这题就很简单了,先判断可以获得的最大公约数,然后再寻找最小的k满足条件即可
个人代码:
import java.util.Scanner;
public class GCD {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long a=sc.nextLong();
long b=sc.nextLong();
long max=Math.abs(a-b);
if (a%max==0){
System.out.print(0);
}else {
System.out.print(max-(a%max));
}
}
}
max-(a%max)是计算a加k个值可以满足公约数包含max;
H:青蛙过河
这题不晓得思路对不对,比赛的时候用的双向的前缀和,然后来判断的,有兴趣看一下,我不晓得对不对。
测试用例:
5 1
1 0 1 0
从左往右前缀和:1 1 2 2
从右往左前缀和:0 1 1 2
然后寻找最小的位置,满足从左往右和从右往左都>=2*x;
跳跃宽度1:1/0 不满足
跳跃宽度2:1/1 不满足
跳跃宽度3:2/1 不满足
跳跃宽度4:2/2 满足
个人代码:
ps:不确定对错,看看就行
import java.util.Scanner;
public class 青蛙过河 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int x=sc.nextInt();
int []arr=new int[n];
int []brr=new int[n];
int []crr=new int[n];
for (int i=1;i<n;i++){
arr[i]=sc.nextInt();
brr[i]=brr[i-1]+arr[i];
}
for (int i=n-1;i>=1;i--){
crr[n-i]=crr[n-i-1]+arr[i];
}
for (int i=1;i<n;i++){
if (brr[i]>=2*x&&crr[i]>=2*x){
System.out.print(i);
return;
}
}
}
}
I:因数平方和
测试样例错了:100000 输出:680584257
这题比赛直接暴力了,1e8范围内的好像都可以出,但是1e9就不行,只能祈祷多点数据是1e8以内!!!
具体思路可以去做一下蓝桥杯练习系统试题集里面的约数个数那个题!!!
个人代码:
初始:
import java.util.Scanner;
public class 因数平方和 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
long s=0;
long k;
for (int i=1;i<=n;i++){
k=n/i;
s+=(k*((long) i *i))%1000000007;
s%=1000000007;
}
System.out.print(s);
}
}
更改:
import java.math.BigInteger;
import java.util.Scanner;
public class 因数平方和 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
long s=0;
long k;
int t= n/2;
for (int i=1;i<=t;i++){
k=n/i;
s+=(k*((long) i *i))%1000000007;
s%=1000000007;
}
BigInteger x= BigInteger.valueOf(n),y= BigInteger.valueOf(t);
BigInteger a= BigInteger.valueOf(1),b= BigInteger.valueOf(2),c= BigInteger.valueOf(6);
x= x.multiply(x.add(a)).multiply(x.multiply(b).add(a)).divide(c);
y= y.multiply(y.add(a)).multiply(y.multiply(b).add(a)).divide(c);
x=(x.add(BigInteger.valueOf(s)).subtract(y)).mod(BigInteger.valueOf(1000000007));
System.out.print(x);
}
}
J:最长不下降子序列
直接暴力骗分的,就不丢人了,溜了溜了!!!
版权归原作者 小怂很怂 所有, 如有侵权,请联系我们删除。