2022.3.25 22:15 洛谷P2141

这题在我看来有点乱,还有好多种情况没有覆盖,然后实际求的好像也与题目描述的有点偏差,都不知道怎么写题解了

C:(100分)

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>]

#define Max 110

int main()
{
	int n = 0;  //用于储存题目中 n 的值

	int finally_answer = 0;  //用于储存 最后输出的答案

	int arr1[Max];

	int arr2[Max];

	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr1[i]);

		arr2[i] = arr1[i];
	}

	for (int i = 0; i < n - 1; i++)  //用于获得 “左值”,即题目样例 1+2=3 中的 1
	{
		for (int j = i + 1; j < n; j++)  //用于获得 “右值”,即题目样例 1+2=3 中的 2
		{
			for (int k = 0; k < n; k++)  //用于遍历整个 数组arr2,以此来判断 数组arr2 内是否有等于 “得数” 的数
			{
				if (arr1[i] + arr1[j] == arr2[k])  //“左值” + “右值“ = “得数”
				{
					arr2[k] = 0;  //把 数组arr2 中  等于“得数”的数  变成0,因为题目是要求“正整数”,变成0后 哪怕下次循环 上两行求出的“得数” 与这次一样,上两行的if判断也不会通过

					finally_answer++;  //让最后输出的数自增
				}
			}
		}
	}

	printf("%d", finally_answer);


	return 0;
}

C++:(100分)

相较于C的话,C++我的想法是采用set容器

一来是不用遍历直接查找内容,二来是可以删除元素。

相较于C中把 数组arr2中元素 变成0的做法,每删除一个容器中的元素就可以在查找的时候少遍历一次。

但理想很美好,现实很骨感。为什么两个用时一样啊喂

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>

#include <set>

using namespace std;

#define Max 110


int main()
{
	int n = 0;

	int finally_answer = 0;

	int c = 0;

	int arr1[Max];

	set<int> arr2;

	scanf("%d", &n);

	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr1[i]);

		arr2.insert(arr1[i]);
	}


	for (int i = 0; i < n - 1; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			//创建一个 迭代器it ,用于接收函数的返回值
			set<int>::iterator pos = arr2.find(arr1[i] + arr1[j]);   //arr2.find() - set容器的查找函数,用于查找指定元素。
			//如果查找到了,就 返回 查找到的元素在这个容器中 的迭代器
			//如果没有找到,就 返回一个指向 最后一个元素下一个位置 的迭代器)

			if (pos != arr2.end())
			{
				arr2.erase(pos);

				finally_answer++;
			}

		}
	}

	printf("%d", finally_answer);


	return 0;
}

python: (100分)

python的话我的想法也是和C++一样采用容器的方法

但python方面我学得很浅,稍微看了下几个容器的介绍,发现set容器有个比较有趣的方法是求交集,就来搞搞看吧

总代码:

input("")

a = set(map(int, input().split(" ")))

b = set()

for i in a:
    for j in a:
        if i != j:
            b.add(i + j) 


print(len(b.intersection(a)))

解析:

input("")  # 把第一行的输入干掉,第一行的输入没什么用

a = set(map(int, input().split(" ")))
'''
这一行代码可以细分为 5 步,运行顺序由里到外

1. input() - 接受输入的内容,并返回 处理过的 输入的内容
   这里由于python会自动识别输入内容的缘故,输入的 1 2 3 4 会被自动识别为 字符串(str)"1 2 3 4"  (空格也算在字符串内)
   最后返回 字符串(str)"1 2 3 4"


2. input().split(" ")
   split(" ") 本来是用于字符串分割的   即str.split(" ")
   由于之前 input()返回了 一个 字符串(str)"1 2 3 4"

   那么现在是:  "1 2 3 4".split(" ")
                     str.split(" ")

   split是一个类内函数,split() 的 () 内填写的是分割的参数,这个参数要是 字符串(例:"@#") 或者 字符(例:‘@’)    (由于python里面双引号" 和 单引号' 不像 C或C++ 那样严格,有时我会混用)
   然后就会根据这个字符串进行分割,并最后返回一个分割完成的列表,例:

                                       分割前(是字符串)            分割后(变成列表了)
    "1 2 3 4".split(" ")       ->        "1 2 3 4"       ->    ['1', '2', '3', '4']
    "d@*f#@*%*".split("@*")    ->        "d@*f#@*%*"     ->    ['d', 'f#', '%*']


3. map(int, input().split(" "))
   由 步骤2 知道了 input().split(" ") 会返回一个列表
   所以 map(int, input().split(" ")) 可以看成 map(int, 某列表)

   map() - 把一个函数func依次映射到序列或迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果

   讲人话:
   以这个 map(int, 某列表) 为例,就是对 某列表 内的每一个元素 都执行 int操作(这里的int是指 数据强制装换成int类型, 根据需求也可以换其他类型)
   map(int, 某列表) 的 int 的位置可以变成 其他(已定义的)函数,就相当于 对 某列表 内的每一个元素 都执行 其他函数 的操作

   例:
                                                                map(int, ['1', '2', '3', '4'])
   ['1', '2', '3', '4'] (原来这个列表每一个元素都是char类型的)    ————————————————————————————————————>    ['1', '2', '3', '4'] (这个列表每一个元素都变成int类型了)

                                             map(某个使传入的参数自增的函数(), ['1', '2', '3', '4'])
   ['1', '2', '3', '4'](元素都是int类型)    ——————————————————————————————————————————————————————————>   ['2', '3', '4', '5'](这个列表每一个元素都自增了)


   最后说一下map的返回:
   在python3中 map 是返回一个 迭代器(指针)的, 这个 迭代器(指针) 指向 被处理完成后的 内容 的地址
   在其他版本中 map 好像是返回 list 的


4. set(map(int, input().split(" ")))
   由 3 知道 map(int, input().split(" ")) 返回的是一个迭代器

   而这里的set()不是函数,而是强制转换(类似于int())

   作用是将迭代器指向的目标强制转换成 map
   在这里 是将原来的 列表 变成一个 元素相同的set容器 (地址变没变不清楚)


5. a = set()
   a - 变量名
   把 强制转换得到的内容 储存到 a
'''

b = set()  # 创建一个 set容器 ,但里面没有元素

for i in a:  # 遍历 a中的每一个元素并赋值给 i
    for j in a:  # 遍历 a中的每一个元素并赋值给 j
        if i != j:
            b.add(i + j)  # 往 set容器b 中 添加 i + j 算术的结果(int类型)


print(len(b.intersection(a)))
'''
这一行代码可以细分为 3 步,运行顺序由里到外

1. b.intersection(a) 
   返回 b 与 a 的交集,这个交集也是 set容器
   还有其他用法,自己百度


2. len(b.intersection(a))
   由 1 得到 b.intersection(a) 返回的是一个 set容器
   len(b.intersection(a)) 可以看成 len(某容器)

   在这里len(某容器)是返回 某容器 的 元素个数 (也有用来返回对象长度的其他用法)

   返回的 元素个数为 int类型

3. print() 
   。。。。。。就打印
'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值