记一次枚举的坑

蒜头君给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。比如,对于数列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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值