蒜头君给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。比如,对于数列1 2 3 4,这个问题的答案就是 2,因为 3 = 2 + 1, 4 = 1 + 3
输入格式
共两行,第一行是数列中数的个数 n(1 ≤ n ≤ 100),第二行是由 n 个不大于10000 的正整数组成的数列,相邻两个整数之间用单个空格隔开。
输出格式
一个整数,即数列中等于其他两个数之和的数的个数。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
4
1 2 3 4
样例输出
2
错误示例1:
不能把稍稍大点的数的for循环放在最后,不然从时间复杂度上来说,还有其他一些坑来讲真的不太好PS:(我暂时还没有想到其他的坑在哪儿,有大佬看见的话 望指点)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
vector <int> v;
int main(){
int m,sum = 0;
cin >> m;
for(int i = 0;i < m;i++){
cin >> v[i];
}
for(int i = 0;i < m;i++){
for(int j = i;j < m;j++){
for(int k = j;k < m;k++){
if(v[i] + v[j] == v[k]){
sum++;
}
}
}
}
cout << sum;
return 0;
}
错误示例2:
注意两个加数的一定是一大一小 可以用printf测试 模拟下运行结果
不能出现这样的结果 4 = 2 + 2
这次提交上去 只通过了四个测试数据,不知道为什么测试点没有过去(无奈)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
int main(){
int m,sum = 0;
cin >> m;
vector <int> v(m);
for(int i = 0;i < m;i++){
cin >> v[i];
}
for(int i = 2;i < m;i++){
for(int j = 0;j < m;j++){
for(int k = j + 1;k < m;k++){
if(v[i] == v[j] + v[k]){
// printf("%d == %d + %d \n",v[i],v[j],v[k]);
sum++;
}
}
}
}
cout << sum;
return 0;
}
错误示例3:摘自网络上大佬的代码 但是平台可能不一样 在计蒜客平台里面只通过了10个测试点,出发点比较好, 思路也比较新 可以借鉴
#include <bits/stdc++.h>
using namespace std;
int v[10010];
int a[110];
int main(){
int n;
cin>>n;
for(int i = 1;i <= n;i++){
scanf("%d",&a[i]);
v[a[i]]++;
}
int ans=0;
for(int i = 1;i < n;i++)
for(int j = i + 1;j <= n;j++)
if(a[i] + a[j] <= 10000 && v[a[i] + a[j]]){ //第一个条件是为了防止数组越界
ans++;
v[a[i] + a[j]]--;
}
printf("%d",ans);
return 0;
}
题目2:
形如 a ^ 3=b ^3 +c ^3 +d ^ 3的等式被称为完美立方等式。
例如 12 ^3 =6 ^3 +8 ^3 +10 ^3 。
编写一个程序,对任给的正整数 N( N ≤ 100),寻找所有的四元组 (a, b, c, d),使得 a ^ 3=b ^3 +c ^3 +d ^ 3,其中 a,b,c,d 大于 1,小于等于 N,且b ≤ c ≤ d。
输入格式
一个正整数 N (N≤100)。
输出格式
每行输出一个完美立方。输出格式为:
Cube = a, Triple = (b,c,d)
其中 a,b,c,d 所在位置分别用实际求出四元组值代入。
请按照 a 的值,从小到大依次输出。当两个完美立方等式中 a 的值相同,则 b 值小的优先输出;仍相同则 c 值小的优先输出;再相同则 d 值小的先输出。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
24
样例输出
Cube = 6, Triple = (3,4,5)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)
解题思路:
不能把稍稍大点的数的for循环放在最后,不然从时间复杂度上来说,还有其他一些坑来讲真的不太好PS:(我暂时还没有想到其他的坑在哪儿,有大佬看见的话 望指点) 和上面的一样的坑
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cstdio>
using namespace std;
int main(){
int m;
cin >> m;
for(int i = 3;i <= m;i++){
for(int j = 2;j <= m;j++){
for(int k = j;k <= m;k++){
for(int q = k;q <= m;q++){
if(i * i * i == j * j * j + k * k * k + q * q * q ){
printf("Cube = %d, Triple = (%d,%d,%d)\n",i,j,k,q);
}
}
}
}
}
return 0;
}