4、求和
题目
【问题描述】
给定 n 个整数 a1, a2, · · · , an ,求它们两两相乘再相加的和,即 S = a1 · a2 + a1 · a3
+ · · · + a1 · an + a2 · a3 + · · · + an−2 · an−1 + an−2 · an + an−1 · an.
【输入格式】
输入的第一行包含一个整数 n 。
第二行包含 n 个整数 a1, a2, · · · an。
【输出格式】
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
【样例输入】
4
1 3 6 9
【样例输出】
117
【评测用例规模与约定】
对于 30% 的数据,1 ≤ n ≤ 1000,1 ≤ ai ≤ 100。
对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。
解题思路
全遍历。。直接、考虑双for方法
规律,2个相乘-加、
下标
1*2+1*3///到2同理视作1
1*2+,1*2+1,+1*3+1,
计数1*2,1*3,是做整体 即累加
累加为i*( j+1,累加
//j+1题目来说,不乘自己,
所以当i==0,j==1,i==1,j==2,所以j=i+1
代码实现
package 轮1省赛11至13;
import java.util.Scanner;
public class 第13届题目4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int[] array = new int[a];
long count = 0;
for (int i = 0; i < array.length; i++) {
array[i] = sc.nextInt();
}
sc.close();
for (int i = 0; i < array.length; i++) {
for (int j = i +1; j < array.length; j++) {
System.out.println("array[i]:"+i+"array[j]:"+j);
count += array[i] * array[j];
}
}
System.out.println(count);
}
}
![](https://img-blog.csdnimg.cn/img_convert/b17719156c2b5f198f0bfc2093767a15.png)
5、矩形拼接
题目
【问题描述】
已知 3 个矩形的大小依次是 a1 × b1, a2 × b2 和 a3 × b3。用这 3 个矩形能拼 出的所有
多边形中,边数最少可以是多少?
例如用 3 × 2 的矩形(用 A 表示)、4 × 1 的矩形(用 B 表示)和 2 × 4 的矩 形(用 C
表示)可以拼出如下 4 边形。
![](https://img-blog.csdnimg.cn/img_convert/bc41818a02c9755cc5534d867cf06f43.png)
例如用 3 × 2 的矩形(用 A 表示)、3 × 1 的矩形(用 B 表示)和 1 × 1 的矩 形(用 C
表示)可以拼出如下 6 边形。
![](https://img-blog.csdnimg.cn/img_convert/26b61fbf09961e3da7caeddd799dfadd.png)
【输入格式】
输入包含多组数据。
第一行包含一个整数 T,代表数据组数。
以下 T 行,每行包含 6 个整数 a1, b1, a2, b2, a3, b3,其中 a1, b1 是第一个矩 形的边
长,a2, b2 是第二个矩形的边长,a3, b3 是第三个矩形的边长。
【输出格式】
对于每组数据,输出一个整数代表答案。
【样例输入】
2
2 3 4 1 2 4
1 2 3 4 5 6
【样例输出】
4
8
【评测用例规模与约定】
对于 10% 的评测用例,1 ≤ T ≤ 5,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 10,a1 = a2 = a3。
对于 30% 的评测用例,1 ≤ T ≤ 5,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 10。
对于 60% 的评测用例,1 ≤ T ≤ 10,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 20。
对于所有评测用例,1 ≤ T ≤ 1000,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 100。
解题思路
![](https://img-blog.csdnimg.cn/img_convert/3a4f2516810a6b60df5bbba564040ca6.jpeg)
代码实现
?????????/
public class rectangular_splicing_809 {
static int[][] s = {
{0, 1, 2},
{0, 2, 1},
{1, 0, 2},
{1, 2, 0},
{2, 0, 1},
{2, 1, 0}
};
static int[][] s1 = {
{0, 0, 0},
{0, 0, 1},
{0, 1, 0},
{0, 1, 1},
{1, 0, 0},
{1, 0, 1},
{1, 1, 0},
{1, 1, 1}
};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = Integer.parseInt(scanner.nextLine());
String[] inPut = new String[num];
// 输入次数
for (int i = 0; i < num; i++) {
inPut[i] = scanner.nextLine();
}
// 交换矩形顺序
for (int i = 0; i < num; i++) {
String[] l = inPut[i].split(" ");
int[][] L = StringToInt(l);
int[][] ans = new int[6][8];
// 交换矩形长宽
for (int j = 0; j < 6; j++) {
int[][] L1 = chageL(L, s[j]);
for (int k = 0; k < 8; k++) {
for (int m = 0; m < 3; m++) {
if (s1[k][m] == 1) {
L1[m] = changeIt(L1[m]);
}
}
ans[j][k] = getIt(L1);
}
}
System.out.println(getMin(ans));
}
}
// private static void suchu(int[][] l1) {
// for (int i = 0; i < l1.length; i++) {
// for (int j = 0; j < l1[i].length; j++) {
// System.out.print(l1[i][j]);
// }
// }
// System.out.println();
// }
// 交换长宽
private static int[][] chageL(int[][] l, int[] i) {
int[][] L = new int[3][2];
for (int j = 0; j < l.length; j++) {
for (int k = 0; k < l[j].length; k++) {
L[j][k] = l[i[j]][k];
}
}
return L;
}
// 获取最小值
private static int getMin(int[][] ans) {
int num = ans[0][0];
for (int i = 0; i < ans.length; i++) {
for (int j = 0; j < ans[i].length; j++) {
if (num > ans[i][j]) {
num = ans[i][j];
}
}
}
return num;
}
// 交换矩形顺序
private static int[] changeIt(int[] l) {
int[] L = new int[l.length];
L[0] = l[1];
L[1] = l[0];
return L;
}
private static int[][] StringToInt(String[] l) {
int[][] ans = new int[3][2];
for (int i = 0, j = 0; i < 3; i++, j += 2) {
ans[i][0] = Integer.parseInt(l[j]);
ans[i][1] = Integer.parseInt(l[j + 1]);
}
return ans;
}
// 计算改顺序组成的边数量
public static int getIt(int[][] l) {
if ((l[0][0] == l[1][0] && l[0][0] == l[2][0]) || (l[0][0] == l[1][0] && l[0][1] + l[1][1] == l[2][0]))
return 4;
if ((l[0][0] == l[1][0]) || l[0][0] + l[1][0] == l[2][0]) return 6;
return 8;
}
}
6、选数异或
题目
【问题描述】
给定一个长度为 n 的数列 A1, A2, · · · , An 和一个非负整数 x,给定 m 次查 询, 每次询
问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x 。
【输入格式】
输入的第一行包含三个整数 n, m, x 。
第二行包含 n 个整数 A1, A2, · · · , An 。
接下来 m 行,每行包含两个整数 li ,ri 表示询问区间 [li ,ri ] 。
【输出格式】
对于每个询问, 如果该区间内存在两个数的异或为 x 则输出 yes, 否则输出 no。
【样例输入】
4 4 1
1 2 3 4
1 4
1 2
2 3
3 3
【样例输出】
yes
no
yes
no
【样例说明】
显然整个数列中只有 2, 3 的异或为 1。
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n, m ≤ 100;
对于 40% 的评测用例,1 ≤ n, m ≤ 1000;
对于所有评测用例,1 ≤ n, m ≤ 100000 ,0 ≤ x < 2^20 ,1 ≤ li ≤ ri ≤ n , 0 ≤ Ai < 2^20。
解题思路
获得l, r。从l,r遍历,所有组合,进行异或^方法,如果等于x就输出yes
代码实现
package 轮1省赛11至13;
import java.util.Scanner;
//4 4 1
//1 2 3 4
//1 4
//1 2
//2 3
//3 3
public class 第13届题目6 {
static int count = 0;
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 x=sc.nextInt();
int A[]=new int [n+1];
for (int i = 1; i <= n; i++) {
A[i]=sc.nextInt();
}
for (int i = 0; i < m; i++) {
int l=sc.nextInt();
int r=sc.nextInt();
boolean count = false;
for (int j =l; j <= r; j++) {
for (int j2 =l; j2 <= r; j2++) {
if ((A[j]^A[j2])==x) {
count=true;
}
}
}
if (count==false) {
System.out.println("no");
}else {
System.out.println("yes");
}
}
}
}