日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

2017/National _Java_C/2/数字划分

發布時間:2024/5/17 java 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017/National _Java_C/2/数字划分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標題:數字劃分

w星球的長老交給小明一個任務:1,2,3…16 這16個數字分為兩組。

要求:這兩組數字的和相同,并且,兩組數字的平方和也相同,并且,兩組數字的立方和也相同。

請你利用計算機的強大搜索能力解決這個問題。

并提交1所在的那個分組的所有數字。

這些數字要從小到大排列,兩個數字間用一個空格分開。

即類似:1 4 5 8 … 這樣的答案。

注意,只提交這一組數字,不要填寫任何多余的內容。


笨笨有話說:
只要一個組的成員確定了,另一個組的成員也就確定了。枚舉一個組的成員就可以了。
憑直覺,兩個組的成員數目不會差太多吧。

歪歪有話說:
既然求 1 所在的那個組,那只要枚舉剩余的成員就可以了。
貌似都是8個成員的可能性很大啊。

Ideas

常規套路應該是用DFS搜索(提供C++版本),但通過Python的itertools組合數combinations也可以。

C++

#include <iostream> #include <cstring>using namespace std;bool temp[16]; int sum1 = 0, sum2 = 0, sum3 = 0; int num[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};void dfs(int n, int ans1, int ans2, int ans3) {if (n == 16)return;if (ans1 > sum1 || ans2 > sum2 || ans3 > sum3)return;if (ans1 == sum1 && ans2 == sum2 && ans3==sum3) {for (int i = 0; i < 16; i++)if (!temp[i]) cout << num[i] << ' ';cout << endl << endl;}dfs(n + 1, ans1, ans2, ans3);temp[n] = true;dfs(n + 1, ans1 + num[n], ans2 + num[n] * num[n], ans3 + num[n] * num[n] * num[n]);temp[n] = false; }int main() {memset(temp, 0, sizeof(temp));for (int i : num) {sum1 += i;sum2 += i * i;sum3 += i * i * i;}sum1 /= 2;sum2 /= 2;sum3 /= 2;dfs(0, 0, 0, 0);return 0; }

Python

import itertoolsnums = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] for item in itertools.combinations(nums, 8):a = list(item)b = list(set(nums) ^ set(item))if sum(a) == sum(b):if sum([x ** 2 for x in a]) == sum([x ** 2 for x in b]):if sum([x ** 3 for x in a]) == sum([x ** 3 for x in b]):print(a, b) from itertools import combinationsdef check(n1: list, n2: list) -> bool:if sum(n1) == sum(n2):n3 = [i ** 2 for i in n1]n4 = [i ** 2 for i in n2]if sum(n3) == sum(n4):n5 = [i ** 3 for i in n1]n6 = [i ** 3 for i in n2]if sum(n5) == sum(n6):print(f"n1 = {n1}, n2 = {n2}")return Truereturn Falseif __name__ == '__main__':nums = [i for i in range(1, 17)]for item in combinations(nums, 8):if check(list(set(nums) - set(item)), list(item)):exit()

總結

以上是生活随笔為你收集整理的2017/National _Java_C/2/数字划分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。